При построении встроенного типа, а также из другого класса, конструктор встроенного типа не вызывает конструктор суперкласса. Это приводит к тому, что методы __init__ не вызываются для типов, которые появляются после встроенного в MRO.Python 3 встроенных типов __init__ не вызывает super() .__ init__?
Пример:
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()
В этом образце, А .__ init__ никогда не вызывается. Когда B определяется как class B(A, list)
, вместо этого - переключение порядка наследования - он работает по назначению (т. Е. Вызывается A____ init__).
Эта очень тонкая зависимость от порядка наследования кажется довольно не-пифонической, она предназначена именно так? Это также означает, что вы никогда не должны выводить из встроенных типов в сложные иерархии классов, потому что вы не можете знать, где встроенная функция заканчивается в MRO, когда кто-то из вас выводит из ваших классов (ужас обслуживания). Я что-то упускаю?
Дополнительно: Python версии 3.1
Python никогда не имел автоматический вызов суперкласса '__init__' методов – Marcin
Что бы это называет' .__ init__' с? 'list .__ init__' принимает один аргумент и выдает ошибку, если он получает больше. Даже если бы он принял произвольные другие аргументы, он выбил бы первый, и то, что увидит, будет зависеть от порядка наследования. –
Аналогичный вопрос: http: // stackoverflow.com/questions/3277367/how-do-pythons-super-work-with-multiple-inheritance С приходом Guido от ответа на этот вопрос: http://python-history.blogspot.com/2010/06/method- resolution-order.html – aganders3