Все функции __init__
должны вызывать super().__init__()
, например:
class A:
def __init__(self):
super().__init__()
print("in A Init")
class B:
def __init__(self):
super().__init__()
print("in B Init")
class C(B, A):
def __init__(self):
super().__init__()
print("in C Init")
c_obj= C()
Согласно документации функции super()
он возвращает ссылку на «родительский or sibling »класса, в зависимости от того, что будет следующим в порядке разрешения метода. На вершине иерархии он возвращает ссылку на неявный родительский класс object
, который имеет пустой метод __init__
, который ничего не делает.
Для того, чтобы это работало хорошо, это лучше всего для всех унаследованные функции __init__
должны иметь одинаковую сигнатуру, включая общий базовый класс; в этом случае подпись равна __init__(self)
(без дополнительных аргументов), а общий базовый класс - object
, который также имеет __init__(self)
без дополнительных аргументов, так что все в порядке. Другой распространенный шаблон - все они принимают аргументы ключевого слова и передают **kwargs
следующему.