698 votes

Appel d'un parent de la classe de la méthode de la classe enfant en Python?

Lors de la création d'une simple hiérarchie de l'objet en Python, j'aimerais être en mesure d'appeler des méthodes de la classe parent à partir d'une classe dérivée. En Perl et Java, il y a un mot-clé à cette (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 j'ai le nom de la classe parente explicitement de l'enfant. Dans l'exemple ci-dessus, j'aurais du faire quelque chose comme Foo::frotz().

Cela ne semble pas juste, car ce comportement rend difficile les grandes hiérarchies. Si les enfants ont besoin de savoir quelle classe définit une méthode héritée, puis toutes sortes d'informations douleur est créé.

Est-ce une limitation en python, une lacune dans ma compréhension, ou les deux?

861voto

Adam Rosenfield Points 176408

Oui, mais seulement avec la nouvelle-classes de style. Utiliser l' super() fonction de:

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)

148voto

Jay Points 20373

Python a aussi des super ainsi:

super

De retour d'un objet proxy qui délégués des appels de méthode à un parent ou un frère classe de type. C'est utile pour l'accès aux hérité des méthodes qui ont été redéfinie dans une classe. L'ordre de recherche est le même que celui utilisé par getattr (), sauf que le type lui-même est ignorée.

Exemple:

(type[, object-or-type])

86voto

Alex Martelli Points 330805

ImmediateParentClass.frotz(auto) sera très bien, si le parent immédiat de la classe définie frotz lui-même ou d'en hériter. super n'est nécessaire pour le soutien de plusieurs héritage (et puis il ne fonctionne que si chaque classe utilise correctement). En général, AnyClass.ce qui est d'aller le chercher jusqu'à 'ce que' dans AnyClass ancêtres si AnyClass n'est pas de définir le remplacer, et cela est vrai pour les "enfants de la classe de l'appel d'un parent méthode" comme pour tout autre événement!

28voto

yesnik Points 247

Voici un exemple d'utilisation de super():

#New-style classes inherit from object, or from another new-style class
class Dog(object):

    name = ''
    moves = []

    def __init__(self, name):
        self.name = name

    def moves_setup(self):
        self.moves.append('walk')
        self.moves.append('run')

    def get_moves(self):
        return self.moves

class Superdog(Dog):

    #Let's try to append new fly ability to our Superdog
    def moves_setup(self):
        #Set default moves by calling method of parent class
        super(Superdog, self).moves_setup()
        self.moves.append('fly')

dog = Superdog('Freddy')
print dog.name # Freddy
dog.moves_setup()
print dog.get_moves() # ['walk', 'run', 'fly']. 
#As you can see our Superdog has all moves defined in the base Dog class

14voto

lawrence Points 2131

Il y a un super() en Python. C'est un peu bancale, en raison de Python à l'ancienne et de la nouvelle-classes de style, mais il est assez couramment utilisé par exemple dans les constructeurs:

class Foo(Bar):
    def __init__(self):
        super(Foo, self).__init__()
        self.baz = 5

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X