Множественное наследование с одинаковыми базовыми классами в Python - PullRequest
5 голосов
/ 11 ноября 2011

Я пытаюсь обернуть голову вокруг множественного наследования в Python.

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

class Structure(object):
    def build(self, *args):
        print "I am building a structure!"
        self.components = args

И, скажем, у меня есть два класса, которые наследуются отit:

class House(Structure):
    def build(self, *args):
        print "I am building a house!"
        super(House, self).build(*args)

class School(Structure):
    def build(self, type="Elementary", *args):
        print "I am building a school!"
        super(School, self).build(*args)

Наконец, создайте класс, который использует множественное наследование:

class SchoolHouse(School, House):
    def build(self, *args):
        print "I am building a schoolhouse!"
        super(School, self).build(*args)

Затем я создаю объект SchoolHouse и запускаю на нем build:

>>> sh = SchoolHouse()
>>> sh.build("roof", "walls")
I am building a schoolhouse!
I am building a house!
I am building a structure!

Так что мне интересно - что случилось с School классом?Есть ли какой-нибудь способ заставить Python как-то запускать оба?

Мне интересно именно потому, что существует достаточное количество пакетов Django, которые предоставляют пользовательские Managers для моделей.Но, похоже, нет способа объединить их, не написав одного или другого из Менеджеров как наследующего от другого.Было бы неплохо просто импортировать оба и как-то использовать оба, но похоже, что это не может быть сделано?

Кроме того, я думаю, это было бы просто полезно указать на хороший учебник по множественному наследованию в Python,Я уже проделал некоторую работу с Mixins и действительно наслаждаюсь их использованием.Наверное, мне просто интересно, есть ли какой-нибудь элегантный способ объединить функциональность двух разных классов, если они наследуются от одного и того же базового класса.

Да, глупый я.Это была опечатка все время.Я чувствую себя очень глупо.Я обещаю, я всегда ставлю правильный класс, когда я супер в реальной жизни, только когда я пробовал и вставлял, чтобы попробовать это, я испортил.

1 Ответ

15 голосов
/ 11 ноября 2011

Ваш super() вызов SchoolHouse неправильный.

Это:

super(School, self).build(*args)

Должно быть:

super(SchoolHouse, self).build(*args)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...