При построении встроенного типа, а также из некоторого другого класса, конструктор встроенного типа не вызывает конструктор суперкласса. Это приводит к тому, что методы __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