Возможно ли частичное наследование с Python?

Я создаю класс (класс0) в Python, который в настоящее время основан на одном классе (class1); однако, я хотел бы наследовать и от другого класса (класс2). Дело в классе2 заключается в том, что я не хочу всех его методов и атрибутов, мне нужен только один метод. Возможно ли, чтобы класс0 наследовал только один метод из класса2?

Ответ 1

Метод "mixin" с другим классом, который просто реализует метод, который вы хотите, является правильной вещью в этом случае. Но для полноты, поскольку он отвечает именно на то, что вы просите, я добавляю, что да, возможно иметь такое же поведение, как и "частичное наследование", которое вы хотите (но обратите внимание, что такой вещи не существует).

Все, что нужно сделать, это добавить элемент в новый класс, ссылающийся на метод или атрибут, который вы хотите повторить там:

class Class2(object):
   def method(self):
      print ("I am method at %s" % self.__class__)

class Class1(object):
   pass

class Class0(Class1):
   method = Class2.__dict__["method"]

ob = Class0()
ob.method()

Обратите внимание, что получение метода из класса __dict__ необходимо в Python 2.x(до 2.7) - из-за преобразований времени выполнения, которые сделаны для преобразования функции в метод. В Python 3.0 и выше просто измените строку

method = Class2.__dict__["method"]

к

method = Class2.method

Ответ 2

Один путь заключается в использовании подхода "mixin":

class Mixin(object):
    def method(self):
        pass

class C1(Mixin, ...parents...):
    pass

class C2(Mixin, ...parents...):
    pass

Другим способом является композиция:

class C1(object):
    def method(self):
        pass

class C2(object):
    def __init__(self):
        self.c1 = C1()

    def method(self):
        return self.c1.method()

Ответ 3

Почему бы вам не использовать композицию? Попросите свой класс сохранить ссылку на нужный объект и делегировать ему.

Ответ 4

создайте другой базовый класс, реализующий этот метод, и сделайте class2 и class1 как наследующим этот класс