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.
object
był literówką. Ale teraz nie masz nawetsuper
tytułu swojego pytania, do którego się odnosi.