In risposta di Anon:
"Se avete bisogno di qualcosa da super di __init__
essere fatto in aggiunta a ciò che viene fatto nel corso di classe del __init__
, lo devi chiamare tu stesso, dal momento che ciò non avverrà automaticamente "
È incredibile: sta formulando esattamente il contrario del principio di ereditarietà.
Non è che "qualcosa da super __init__
(...) non accadrà automaticamente", è che sarebbe accaduto automaticamente, ma non accade perché la classe base '__init__
viene sovrascritto dalla definizione delle Classe di selezione derivati __init__
Così allora, perchè la definizione di un Derived_Class' __init__
, dal momento che ignora ciò che è finalizzato a quando qualcuno ricorre alla successione ??
È perché è necessario definire qualcosa che NON viene eseguito nella classe base '__init__
e l'unica possibilità di ottenerlo è di mettere la sua esecuzione in una funzione di classe derivata' __init__
.
In altre parole, uno ha bisogno di qualcosa in classe base '__init__
in aggiunta a in quello che verrebbe eseguito automaticamente nella classe base' __init__
se quest'ultimo non è stato sostituito.
NON è il contrario.
Quindi, il problema è che le istruzioni desiderati presenti nella classe base __init__
non sono più attivati al momento di istanziazione. Per compensare questa inattivazione, è necessario qualcosa di speciale: chiamare esplicitamente la classe base '__init__
, al fine di KEEP, NON AGGIUNGERE, l'inizializzazione eseguita dalla classe base' __init__
. Questo è esattamente ciò che viene detto nel documento ufficiale:
Un metodo imperativo di una classe derivata può in effetti voler estendere la piuttosto che semplicemente sostituire il metodo della classe base con lo stesso nome. C'è un modo semplice per chiamare direttamente il metodo della classe base: solo chiama BaseClassName.methodname (self, argomenti).
http://docs.python.org/tutorial/classes.html#inheritance
Questo è tutto la storia:
quando l'obiettivo è quello di mantenere l'inizializzazione eseguita dal classe base, vale a dire l'ereditarietà pura, niente di speciale è necessaria, si deve solo evitare per definire una funzione __init__
nella classe derivata
quando lo scopo è di SOSTITUIRE l'inizializzazione eseguita dalla classe base, __init__
deve essere definito in e classe derivata
quando l'obiettivo è quello di aggiungere i processi per l'inizializzazione eseguita da classe base, una classe derivata __init__
deve essere definita, comprendente una chiamata esplicita alla classe base __init__
quello che sento sorprendente nel post di Anon è non solo che egli esprime al contrario della teoria eredità, ma che ci sono stati 5 ragazzi di passaggio che upvoted senza girare un capello, e inoltre ci sono stato nessuno a reagire in 2 anni in un thread il cui argomento interessante deve essere letto relativamente spesso.
hai cambiato il codice in modo significativo. Posso capire che l'originale 'oggetto' era un refuso. Ma ora non hai nemmeno il titolo "super" della tua domanda. – SilentGhost
Ho appena pensato che super sia usato come nome per la classe genitore. Non pensavo che qualcuno avrebbe pensato alla funzione. Mi dispiace per eventuali equivoci. –
Una domanda di super chiamata automatica: http://stackoverflow.com/questions/3782827/why-arent-pythons-superclass-init-methods-automatically-invoked –