method - python super




Appeler la méthode d'une classe parent de la classe enfant en Python? (8)

Lors de la création d'une hiérarchie d'objets simple en Python, j'aimerais pouvoir 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é 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 de douleurs d'information sont créées.

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


C'est une méthode plus abstraite:

super(self.__class__,self).baz(arg)

De nombreuses réponses ont expliqué comment appeler une méthode du parent qui a été substituée dans l'enfant.

toutefois

"Comment appelez-vous la méthode d'une classe parente de la classe enfant?"

pourrait aussi signifier:

"Comment appelez-vous les méthodes héritées?"

Vous pouvez appeler des méthodes héritées d'une classe parente comme si elles étaient des méthodes de la classe enfant, à condition qu'elles n'aient pas été remplacées.

par exemple en python 3:

class A():
  def bar(self, string):
    print("Hi, I'm bar, inherited from A"+string)

class B(A):
  def baz(self):
    self.bar(" - called by baz in B")

B().baz() # prints out "Hi, I'm bar, inherited from A - called by baz in B"

oui, cela peut être assez évident, mais je pense que sans le signaler, 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 a un taux élevé dans les recherches pour "comment accéder à la méthode d'une classe parente en Python", et l'OP est écrit du point de vue de quelqu'un de nouveau à python.

J'ai trouvé: https://docs.python.org/3/tutorial/classes.html#inheritance utile pour comprendre comment accéder aux méthodes héritées.


Il y a aussi un super () en Python. C'est un peu bancal, à cause des classes de style ancien et nouveau de Python, mais il est assez communément utilisé par exemple dans les constructeurs:

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

Il y a aussi un super () en python.

Exemple de méthode d'appel d'une méthode de super classe à partir d'une méthode de sous-classe

class Dog(object):
    name = ''
    moves = []

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

    def moves_setup(self,x):
        self.moves.append('walk')
        self.moves.append('run')
        self.moves.append(x)
    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().moves_setup("hello world")
        self.moves.append('fly')
dog = Superdog('Freddy')
print (dog.name)
dog.moves_setup()
print (dog.get_moves()) 

Cet exemple est similaire à celui expliqué ci-dessus.Cependant il y a une différence que le super ne possède aucun argument. Ce code ci-dessus est exécutable en version python 3.4.



Python 3 a une syntaxe différente et plus simple pour appeler la méthode parent. Si la classe Foo hérite de Bar , alors de Bar.__init__ peut être appelée à partir de Foo utilisant super().__init__() :

class Foo(Bar):
    def __init__(self):
        super().__init__()


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






object