Wynikając z typu wbudowanego, a także z innej klasy, wydaje się, że konstruktor typu wbudowanego nie wywołuje konstruktora klasy super. Powoduje to, że metody __init__ nie są wywoływane dla typów, które pojawiają się po wbudowaniu w MRO.Python 3 typy wbudowane __init__ nie wywołuje super() .__ init__?
przykład:
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()
W tym przykładzie, A .__ init__ nie jest tzw. Gdy B jest zdefiniowane jako class B(A, list)
zamiast - przełączanie porządku dziedziczenia - działa zgodnie z zamierzeniem (to jest wywoływane jest A .__ init__).
Ta bardzo subtelna zależność od porządku dziedziczenia wydaje się raczej nieprecyzyjna, czy jest to zamierzone w ten sposób? Oznacza to również, że nigdy nie możesz czerpać z wbudowanych typów w skomplikowanych hierarchiach klasowych, ponieważ nie możesz wiedzieć, gdzie wbudowany kończy się w MRO, gdy ktoś inny wywodzi się z twoich klas (horror konserwacyjny). Czy czegoś brakuje?
Dodatkowe info: Python w wersji 3.1
Python nigdy nie miał automatyczne wywołanie nadklasie '__init__' metod – Marcin
Co by to nazwać' a .__ init__' z? 'list .__ init__' przyjmuje jeden argument i zgłasza błąd, jeśli wystąpi. Nawet gdyby zaakceptował dowolne inne argumenty, odrzuciłby pierwszą, więc to, co zobaczyłoby, byłoby zależne od porządku spadkowego. –
Podobne pytanie: http: // stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-dziedziczenie Z podejściem Guido wynikającym z odpowiedzi na to pytanie: http://python-history.blogspot.com/2010/06/method- resolution-order.html – aganders3