Мне любопытно, почему этот код:
class BaseClassA(object):
def __init__(self):
print('A1')
# super().__init__()
print('A2')
class BaseClassB(object):
def __init__(self):
print('B1')
# super().__init__()
print('B2')
class ChildClass(BaseClassA, BaseClassB):
pass
c = ChildClass()
Печать:
A1
A2
А не (как я ожидал):
A1
A2
B1
B2
Теперь, если вы раскомментируете эти две строки, содержащие вызов __init __ () из суперкласса, вы получите:
A1
B1
B2
A2
Мне кажется, что super () .__ init __ (), вызываемый из BaseClassA, вызывает __init __ () из BaseClassB. Вы можете объяснить мне это странное поведение?
Редактировать: Я видел вопрос это, но до сих пор не знаю, почему метод __init__ одного базового класса (A) влияет на вызов __init__ из другого базового класса (B)
См. этот ответ, чтобы понять, почему super().__init__() в BaseClassA вызывает BaseClassB.__init__.
Но почему super () .__ init __ () из BaseClassA вызывает BaseClassB .__ init __ ()? BaseClassA знает ничего такого о BaseClassB.






Python не вызывает автоматически методы
__init__всех родительских классов за вас. Представьте, что у обоихBaseClassAиBaseClassBесть методfoo. Ожидаете ли вы, чтоChildClass().foo()вызовет унаследованные от оба методыfoo? Конечно, вы этого не сделаете, и то же самое происходит при вызове вашего__init__. Поскольку вашChildClassне имеет метода__init__, в итоге python вызывает__init__, который вы унаследовали отBaseClassA. Если вы хотите вызвать их обоих, вам нужно написать код, который это сделает.