При наследовании от встроенного типа, а также от некоторого другого класса, кажется, что конструктор встроенного типа не вызывает конструктор суперкласса. Это приводит к тому, что методы __init__ не вызываются для типов, которые идут после встроенной в MRO.
Пример:
class A:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print("A().__init__()")
class B(list, A):
def __init__(self, *args, **kwargs):
print("B().__init__() start")
super().__init__(*args, **kwargs)
print("B().__init__() end")
if __name__ == '__main__':
b = B()
В этом примере A .__ init__ никогда не вызывается. Когда B определяется как class B (A, list)
вместо этого - переключение порядка наследования - он работает как задумано (т.е. вызывается A .__ init__).
Эта очень тонкая зависимость от порядка наследования кажется довольно непифонической, так ли это задумано? Это также означает, что вы никогда не должны наследовать от встроенных типов в сложных иерархиях классов, потому что вы не можете знать, где эта встроенная функция заканчивается в MRO, когда кто-то другой является производным от ваших классов (ужас обслуживания). Я что-то упускаю?
Дополнительная информация: Python версии 3.1