Множественное наследование: происходит что-то неожиданное ...? - PullRequest
0 голосов
/ 28 сентября 2019

Я учу себя концепции ой на питоне.Я случайно набрал B().__init__() внутри init метод дочернего класса C. Это код.

class A:
    def __init__(self):
        print('A')

class B:
    def __init__(self):
        print('B')

class C(A,B):
    def __init__(self):
        print('C')
        B().__init__()

c1 = C()

, и это вывод

C
B
B

Почему Bпечатается 2 раза?

Ответы [ 3 ]

1 голос
/ 28 сентября 2019

Вы создаете экземпляр B в init () методе C. Затем вы вызываете init () метод B явно.Вы хотите иметь:

class C(A,B):
    def __init__(self):
        print('C')
        super().__init__(self)
0 голосов
/ 28 сентября 2019

Правильный способ обеспечить инициализацию родительских базовых классов заключается в следующем (вы не указали, является ли ваш Python Python 2 или Python 3, поэтому я гарантирую, что ваши классы наследуются от класса object):

class A(object):
    def __init__(self):
        print('A')
        super(A, self).__init__()
        #super().__init__() # alternate call if Python 3

class B(object):
    def __init__(self):
        print('B')
        super(B, self).__init__()
        #super().__init__() # alternate call  if Python 3

class C(A,B):
    def __init__(self):
        print('C')
        super(C, self).__init__()
        #super().__init__() # alternate call if Python 3

c1 = C()

Или вы можете просто сделать следующее:

class A():
    def __init__(self):
        print('A')

class B():
    def __init__(self):
        print('B')

class C(A,B):
    def __init__(self):
        print('C')
        A.__init__(self)
        B.__init__(self)

c1 = C()
0 голосов
/ 28 сентября 2019

в соответствии с документацией Python говорится, что
_init __ - это специальный метод Python, который автоматически вызывается, когда для нового объекта выделяется память
.
мы также можем вызвать __ init __ метод явно, и это то, что вы сделали в приведенном выше коде.
B () - это вызов конструктора, и первый __ init __ был вызван.
ипосле того, как __ init __ () был вызван вами явно.так что 2 раза
звонок был сделан.

...