Lors de la création d'une hiérarchie d'objets simple en Python, j'aimerais pouvoir invoquer des méthodes de la classe parente à partir d'une classe dérivée. En Perl et Java, il existe un mot-clé pour cela ( super
). En Perl, je pourrais faire ceci:
package Foo;
sub frotz {
return "Bamf";
}
package Bar;
@ISA = qw(Foo);
sub frotz {
my $str = SUPER::frotz();
return uc($str);
}
En Python, il semble que je doive nommer explicitement la classe parente de l'enfant. Dans l'exemple ci-dessus, je devrais faire quelque chose comme Foo::frotz()
.
Cela ne semble pas correct car ce comportement rend difficile la création de hiérarchies profondes. Si les enfants ont besoin de savoir quelle classe a défini une méthode héritée, alors toutes sortes d'informations sont créées.
Est-ce une limitation réelle en python, une lacune dans ma compréhension ou les deux?
python
inheritance
class
object
jjohn
la source
la source
Réponses:
Oui, mais uniquement avec des classes de nouveau style . Utilisez la
super()
fonction:Pour python <3, utilisez:
la source
super(Foo, self)
est-elle correcte pour Python 2.x? Dans Python 3.x, lasuper()
préférence est-elle correcte?Python a également des super :
super(type[, object-or-type])
Exemple:
la source
sera très bien, que la classe parent immédiate se soit définie
frotz
ou en ait hérité.super
n'est nécessaire que pour la prise en charge appropriée de l' héritage multiple (et cela ne fonctionne que si chaque classe l'utilise correctement). En général,AnyClass.whatever
va chercherwhatever
dansAnyClass
les ancêtres de s'ilAnyClass
ne le définit pas / ne le remplace pas, et cela vaut pour la "classe enfant appelant la méthode du parent" comme pour toute autre occurrence!la source
parent
, elle fait partie de la classe entière, n'est-ce pas?Python 3 a une syntaxe différente et plus simple pour appeler la méthode parent.
Si la
Foo
classe hérite deBar
, alors fromBar.__init__
peut être invoqué depuisFoo
viasuper().__init__()
:la source
De nombreuses réponses ont expliqué comment appeler une méthode du parent qui a été remplacée par l'enfant.
toutefois
pourrait aussi signifier simplement:
Vous pouvez appeler des méthodes héritées d'une classe parent comme si elles étaient des méthodes de la classe enfant, tant qu'elles n'ont pas été écrasées.
par exemple en python 3:
oui, cela peut être assez évident, mais je pense que sans le souligner, les gens peuvent laisser ce fil avec l'impression que vous devez sauter à travers des cerceaux ridicules juste pour accéder aux méthodes héritées en python. D'autant plus que cette question est très appréciée dans les recherches de "comment accéder à la méthode d'une classe parente en Python", et que l'OP est écrit du point de vue de quelqu'un de nouveau en python.
J'ai trouvé: https://docs.python.org/3/tutorial/classes.html#inheritance utile pour comprendre comment vous accédez aux méthodes héritées.
la source
self.string
ne fera rien. En classe C, vous pouvez cependant appelerB().bar(string)
Voici un exemple d'utilisation de super () :
la source
Il y a aussi un super () en Python. C'est un peu loufoque, à cause des classes de style ancien et nouveau de Python, mais il est assez couramment utilisé par exemple dans les constructeurs:
la source
Je recommanderais d'utiliser
CLASS.__bases__
quelque chose comme çala source
Si vous ne savez pas combien d'arguments vous pourriez obtenir et que vous souhaitez également les transmettre à l'enfant:
(De: Python - La façon la plus propre de remplacer __init__ où un kwarg optionnel doit être utilisé après l'appel de super ()? )
la source
Il y a aussi un super () en python.
Exemple sur la façon dont une méthode de super classe est appelée à partir d'une méthode de sous-classe
Cet exemple est similaire à celui expliqué ci-dessus.Cependant, il y a une différence que super n'a pas d'arguments passés.Ce code ci-dessus est exécutable dans la version python 3.4.
la source
Dans cet exemple, il
cafec_param
s'agit d'une classe de base (classe parent) et d'abc
une classe enfant.abc
appelle laAWC
méthode dans la classe de base.Production
la source
En Python 2, je n'ai pas eu beaucoup de chance avec super (). J'ai utilisé la réponse de jimifiki sur ce fil SO comment faire référence à une méthode parent en python?. Ensuite, j'ai ajouté ma propre petite touche, ce qui, je pense, est une amélioration de la convivialité (surtout si vous avez des noms de classe longs).
Définissez la classe de base dans un module:
Importez ensuite la classe dans un autre module
as parent
:la source
class A(object):
place declass A():
Then super () fonctionnerala source
la source
Il s'agit d'une méthode plus abstraite:
la source
super(self.__class__, self).baz(arg)
.