Предположим, что у одного есть простая установка множественного наследования, с двумя базовыми классами A
и B
и одним дочерним классом C
, наследующими оба.
class A:
def __init__(self):
print("Started A's constructor")
# -- Not calling: super().__init__() --
print("Ended A's constructor")
class B:
def __init__(self):
print("Started B's constructor")
super().__init__()
print("Ended B's constructor")
class C(A, B):
def __init__(self):
print("Started C's constructor")
super().__init__()
print("Ended C's constructor")
После вызова
c = C()
мы получаем вывод
Started C's constructor
Started A's constructor
Ended A's constructor
Ended C's constructor
Если я хочу вызвать оба конструктора базового класса для каждого объекта C
, и у меня нет доступа к базовому классу для добавления super().__init__()
вызов, что нужно изменить или добавить к C
?Есть ли способ сделать это так, чтобы он не сломался, если A
действительно вызвал super().__init__()
?(Изменить: для ясности, добавление super().__init__()
к A
вызовет конструктор B
, следующий за ним в MRO; чтобы сделать это более понятным: пример кода )
Что еще более важно, в общем случае, когда каждый хочет вызвать каждый __init__
метод каждого предка ровно один раз, и не был уверен в том, что каждая функция __init__
вызывает super().__init__()
, как можно было бы гарантировать, что каждый родительский класс был вызван один раз итолько один раз?
Если это невозможно, не подорвет ли это фундаментальные объектно-ориентированные принципы?Просто в этом случае реализация A
не должна влиять на поведение B
.