Встроенные типы Python 3 __init__ не вызывают super () .__ init __?

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

15
задан Christian Aichinger 6 March 2015 в 13:38
поделиться