W odpowiedzi Anona:
„Jeśli potrzebujesz czegoś z superumiejętności __init__do zrobienia oprócz tego, co jest robione w bieżącej klasie __init__, musisz to nazwać sam, ponieważ nie stanie się to automatycznie”
To niewiarygodne: mówi dokładnie przeciwnie do zasady dziedziczenia.
Nie chodzi o to, że "coś z super __init__ (...) nie wydarzy się automatycznie" , chodzi o to, że BYŁO to automatycznie, ale nie dzieje się tak, ponieważ klasa bazowa ' __init__jest nadpisana przez definicję klas pochodnych__init__
Więc DLACZEGO definiowanie klasy pochodnej __init__, skoro zastępuje to, do czego jest skierowane, gdy ktoś ucieka się do dziedziczenia?
Dzieje się tak, ponieważ trzeba zdefiniować coś, czego NIE robi się w klasie bazowej ' __init__, a jedyną możliwością uzyskania tego jest umieszczenie jej wykonania w __init__funkcji klasy pochodnej' .
Innymi słowy, potrzeba czegoś w klasie bazowej „ __init__oprócz tego, co zostałoby zrobione automatycznie w klasie podstawowej”, __init__gdyby ta ostatnia nie została zastąpiona.
NIE przeciwnie.
Następnie problem polega na tym, że pożądane instrukcje obecne w klasie bazowej ' __init__nie są już aktywowane w momencie ich tworzenia. Aby zrównoważyć tę dezaktywację, wymagane jest coś specjalnego: jawne wywołanie klasy bazowej „ __init__w celu ZACHOWANIA , NIE DODAWANIA, inicjalizacji wykonywanej przez klasę bazową” __init__. Dokładnie to jest powiedziane w oficjalnym dokumencie:
Metoda przesłaniająca w klasie pochodnej może w rzeczywistości chcieć rozszerzyć, a nie po prostu zastąpić metodę klasy bazowej o tej samej nazwie. Istnieje prosty sposób bezpośredniego wywołania metody klasy bazowej: po prostu wywołaj BaseClassName.methodname (self, arguments).
http://docs.python.org/tutorial/classes.html#inheritance
To cała historia:
gdy celem jest ZACHOWANIE inicjalizacji wykonywanej przez klasę bazową, czyli czyste dziedziczenie, nic specjalnego nie jest potrzebne, należy po prostu unikać definiowania __init__funkcji w klasie pochodnej
gdy celem jest ZASTĄPIENIE inicjalizacji wykonywanej przez klasę bazową, __init__musi być zdefiniowana w klasie pochodnej
gdy celem jest dodanie procesów do inicjalizacji wykonywanej przez klasę bazową, __init__ należy zdefiniować klasę pochodną , zawierającą jawne wywołanie klasy bazowej__init__
To, co czuję zdumiewające na stanowisku Anona, to nie tylko to, że wyraża on przeciwieństwo teorii dziedziczenia, ale że było 5 facetów, którzy przeszli obok tego głosowania bez odwracania włosów, a ponadto nie było nikogo, kto zareagowałby przez 2 lata w wątek, którego interesujący temat trzeba czytać stosunkowo często.
objectbył literówką. Ale teraz nie masz nawetsupertytułu swojego pytania, do którego się odnosi.