Dans sa réponse Anon:
« Si vous avez besoin de quelque chose de super de __init__
à faire en plus de ce qui est fait dans __init__
de la classe actuelle, vous devez l'appeler vous-même, car cela ne se produira pas automatiquement "
C'est incroyable: il exprime exactement le contraire du principe de l'héritage.
Ce n'est pas « quelque chose de super __init__
de (...) ne se produira pas automatiquement », il est qu'il se passerait-il automatiquement, mais il ne se produit pas parce que la classe de base « __init__
est outrepassée par la définition des dérivés de clas __init__
alors, pourquoi la définition d'une Derived_Class » __init__
, puisqu'il l'emporte sur ce qui est visé quand quelqu'un recourt à l'héritage ?? C'est parce qu'on a besoin de 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 fonction' __init__
de la classe dérivée.
En d'autres termes, il faut quelque chose dans la classe de base '__init__
en plus à ce qui serait fait automatiquement dans la base-classe' si ce dernier n'était pas redéfini.
PAS le contraire.
Ensuite, le problème est que les instructions présentes dans la classe de base __init__
ne sont pas souhaités 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 KEEP, NOT TO ADD, l'initialisation effectuée par la classe de base' __init__
. Ce est exactement ce qui est dit dans le document officiel:
Une méthode redéfinie dans une classe dérivée peut en effet vouloir étendre plutôt que de simplement remplacer la méthode de classe de base du même nom. Il existe un moyen simple d'appeler la méthode de la classe de base directement: juste appel BaseClassName.methodname (self, arguments).
http://docs.python.org/tutorial/classes.html#inheritance
Voilà toute l'histoire:
lorsque l'objectif est de maintenir l'initialisation effectuée par la classe de base, qui est l'héritage pur, rien est nécessaire de procéder, il faut juste éviter à définir une fonction __init__
dans la classe dérivée
lorsque le but est de remplacer l'initialisation effectuée par la base de classe, __init__
doit être défini en e e dérivée de la classe
lorsque le but est d'ajouter des processus à l'initialisation effectuée par la base de classe, il faut définir une classe dérivée __init__
, comprenant un appel explicite à la classe de base __init__
ce que je ressens étonnante dans le poste de Anon est non seulement qu'il exprime au contraire de la théorie de l'héritage, mais il y a eu 5 gars qui passent par cette upvoted sans broncher, et d'ailleurs il y a eu été personne pour réagir en 2 ans dans un fil dont le sujet intéressant doit être lu relativement souvent.
vous avez modifié votre code de manière significative. Je peux comprendre que 'object' original était une faute de frappe. Mais maintenant vous n'avez même pas le titre «super» de votre question. – SilentGhost
Je pensais juste que super est utilisé comme nom pour la classe parent. Je ne pensais pas que quelqu'un penserait à la fonction. Je suis désolé pour tout malentendu. –
Une question pourquoi pas automatique super appel: http://stackoverflow.com/questions/3782827/why-arent-pythons-superclass-init-methods-automatically-invoked –