Dans Anon réponse:
"Si vous avez besoin de quelque chose de super de l' __init__
à faire en plus de ce qui est fait dans la classe actuelle de l' __init__
, vous devez appeler vous-même, car cela ne se produira pas automatiquement"
C'est incroyable: il est libellé exactement le contraire du principe de l'héritage.
.
Ce n'est pas que "quelque chose de super de l' __init__
(...) ne se fera pas automatiquement" , c'est qu'il ALLAIT se faire automatiquement, mais il n'arrive pas parce que la classe de base' __init__
est remplacée par la définition de la dérivée-clas __init__
Alors, POURQUOI la définition d'un derived_class' __init__
, puisqu'il remplace ce qui est destiné à quand quelqu'un recours à l'héritage ??
C'est parce que l'on a besoin de définir quelque chose qui n'est PAS fait dans la classe de base' __init__
, et la seule possibilité de les obtenir est de mettre son exécution dans une dérivée de la classe' __init__
fonction.
En d'autres termes, on a besoin de quelque chose dans la classe de base' __init__
de plus à ce qui allait être fait automatiquement dans la base-classe' __init__
si ce dernier n'était pas surchargée.
PAS le contraire.
.
Ensuite, le problème, c'est que le souhaité instructions présentes dans la classe de base' __init__
ne sont plus activés au moment de l'instanciation. Afin de compenser cette inactivation, quelque chose de spécial est requis: appeler explicitement la classe de base' __init__
, afin de GARDER , DE ne PAS AJOUTER, l'initialisation réalisée par la classe de base' __init__
.
C'est exactement ce qui est dit dans la doc officielle:
Une méthode de remplacement dans une classe dérivée peut, en fait, veulent étendre
plutôt que de simplement remplacer la classe de base de la méthode du même nom.
Il existe un moyen simple pour appeler la méthode de classe de base directement: il suffit de
appel BaseClassName.methodname(de soi, des arguments).
http://docs.python.org/tutorial/classes.html#inheritance
C'est toute l'histoire:
lorsque l'objectif est de MAINTENIR l'initialisation réalisée par la classe de base, qui est pur héritage, rien de spécial n'est nécessaire, il faut juste éviter de définir une __init__
de la fonction dans la classe dérivée
lorsque l'objectif est de REMPLACER l'initialisation réalisée par la classe de base, __init__
doit être défini dans la dérivée de la classe
lorsque l'objectif est d'AJOUTER des processus à l'initialisation réalisée par la classe de base, un dérivé de la classe' __init__
doit être défini , comprenant un appel explicite à la classe de base __init__
.
Ce que je ressens étonnant dans le poste de Anon n'est pas seulement qu'il exprime le contraire de l'héritage de la théorie, mais qu'il y a eu 5 gars en passant par upvoted sans tourner les cheveux, et en plus, il y a eu personne pour réagir en 2 ans dans un fil dont le sujet doit être lu assez souvent.