Конструктор множественного наследования Python не вызывается при использовании super ()

python oop inheritance python-3.x multiple-inheritance

457 просмотра

2 ответа

Рассмотрим следующий код:

class A(object):
    def __init__(self):
        pass
class B(object):
    def __init__(self):
        self.something = 'blue'
    def get_something(self):
        return self.something
class C(A,B):
    def __init__(self):
        super().__init__()
        print(self.get_something())

а затем сделать:

c = C()

что приводит к чему-то вроде этого:

AttributeError: 'C' object has no attribute 'something'

Я полагаю, это происходит из-за того, что конструктор B не вызывается при использовании super (). Есть ли способ добиться правильного поведения с Python 3?

Автор: Stefan Источник Размещён: 12.11.2019 09:45

Ответы (2)


11 плюса

Решение

Суперклассы должны использовать super, если их подклассы делают. Если вы добавите super().__init__()строку в A и B, ваш пример должен работать снова.

Проверьте порядок разрешения метода C:

>>> C.mro()
[__main__.C, __main__.A, __main__.B, builtins.object]

Эта статья должна прояснить ситуацию.

Автор: wim Размещён: 18.08.2014 09:57

1 плюс

Как уже упоминалось, порядок разрешения методов является ключевым здесь. Если вы хотите вызвать несколько конструкторов суперкласса, вам придется вызывать их напрямую.

class A(object):
    def __init__(self):
        pass
class B(object):
    def __init__(self):
        self.something = 'blue'
    def get_something(self):
        return self.something
class C(A,B):
    def __init__(self):
        A.__init__(self)
        B.__init__(self)
        print(self.get_something())
Автор: Andrew Johnson Размещён: 18.08.2014 10:03
Вопросы из категории :
32x32