Dans la réponse d'Anon:
"Si vous avez besoin de faire quelque chose de super __init__
en plus de ce qui est fait dans la classe actuelle __init__
, vous devez l'appeler vous-même, car cela ne se produira pas automatiquement"
C'est incroyable: il formule exactement le contraire du principe de l'héritage.
Ce n'est pas que "quelque chose de super __init__
(...) ne se produira pas automatiquement" , c'est que cela se produira automatiquement, mais cela n'arrivera pas parce que la classe de base ' __init__
est remplacée par la définition de la classe dérivée__init__
Alors, POURQUOI définir une classe_ dérivée ' __init__
, puisqu'elle remplace ce qui est visé quand quelqu'un recourt à l'héritage ??
C'est parce qu'il faut définir quelque chose qui n'est PAS fait dans la classe de base ' __init__
, et la seule possibilité d'obtenir cela est de mettre son exécution dans une __init__
fonction de classe dérivée' .
En d'autres termes, il faut quelque chose dans la classe de base ' __init__
en plus de ce qui serait automatiquement fait dans la classe de base' __init__
si cette dernière n'était pas remplacée.
PAS le contraire.
Ensuite, le problème est que les instructions souhaitées présentes dans la classe de base ' __init__
ne sont plus activées au moment de l'instanciation. Afin de compenser cette inactivation, quelque chose de spécial est nécessaire: appeler explicitement la classe de base ' __init__
, afin de GARDER , NE PAS AJOUTER, l'initialisation effectuée par la classe de base' __init__
. C'est exactement ce qui est dit dans la doc officielle:
Une méthode de substitution dans une classe dérivée peut en fait vouloir étendre plutôt que simplement remplacer la méthode de classe de base du même nom. Il existe un moyen simple d'appeler directement la méthode de classe de base: il suffit d'appeler BaseClassName.methodname (self, arguments).
http://docs.python.org/tutorial/classes.html#inheritance
C'est toute l'histoire:
lorsque le but est de GARDER l'initialisation effectuée par la classe de base, c'est-à-dire l'héritage pur, rien de spécial n'est nécessaire, il faut juste éviter de définir une __init__
fonction dans la classe dérivée
lorsque le but est de REMPLACER l'initialisation effectuée par la classe de base, __init__
doit être définie dans la classe dérivée
lorsque le but est d'ajouter des processus à l'initialisation effectuée par la classe de base, une classe dérivée ' __init__
doit être définie, comprenant un appel explicite à la classe de base__init__
Ce que je ressens étonnant dans le poste d'Anon, ce n'est pas seulement qu'il exprime le contraire de la théorie de l'héritage, mais qu'il y a eu 5 mecs qui passent par ce vote à la hausse sans tourner les cheveux, et de plus il n'y a eu personne pour réagir en 2 ans en un fil dont le sujet intéressant doit être lu relativement souvent.
object
était une faute de frappe. Mais maintenant, vous n'avez même pas lesuper
titre de votre question.