Можно ли сделать частичное наследование с Python? - PullRequest
15 голосов
/ 13 апреля 2011

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

Ответы [ 4 ]

14 голосов
/ 13 апреля 2011

Метод «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
12 голосов
/ 13 апреля 2011

Один из способов - использовать подход 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()
6 голосов
/ 13 апреля 2011

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

3 голосов
/ 13 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...