web-dev-qa-db-fra.com

Comment appeler super méthode depuis la classe de petits-enfants?

Je travaille avec du code qui a 3 niveaux d'héritage de classe. À partir de la classe dérivée de niveau le plus bas, quelle est la syntaxe pour appeler une méthode sur 2 niveaux dans la hiérarchie, par ex. un super appel? La classe "intermédiaire" n'implémente pas la méthode à appeler.

36
SeanLabs

Eh bien, c'est une façon de le faire:

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def my_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Hello Grandparent"
        Grandparent.my_method(self)

C’est peut-être pas ce que vous voulez, mais c’est le meilleur python a sauf erreur de ma part. Ce que vous demandez est digne de l’anti-Pythonique et vous auriez à expliquer pourquoi vous le faites nous allons vous donner la manière heureuse python de faire les choses.

Un autre exemple, peut-être ce que vous voulez (d'après vos commentaires):

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def some_other_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Hello Grandparent"
        super(Child, self).my_method()

Comme vous pouvez le constater, Parent n'implémente pas my_method mais Child peut toujours utiliser super pour obtenir la méthode que Parent "voit", c.-à-d. Grandparent's my_method.

60
CrazyCasta

Cela fonctionne pour moi:

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def my_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Hello Grandparent"
        super(Parent, self).my_method()
27
Tomasz

Fabriqué et testé dans python 3

class Vehicle:

    # Initializer / Instance Attributes
    def __init__(self, name, price):
        self.name = name
        self.price = price

    # instance's methods
    def description(self):
        print("\nThe car {} has a price of {} eur".format(self.name, self.price))
#Object Vehicle

m3 = Vehicle("BMW M3", 40000)

m3.description()

class Camper(Vehicle):

     def __init__(self,nome,prezzo,mq):
         super().__init__(nome,prezzo)
         self.mq=mq

         # instance's methods

     def description(self):
         super().description()
         print("It has a dimension of",format(self.mq)+" mq")

#Camper Object(A camper is also a Vehicle)
marcopolo=Camper("Mercede MarcoPolo",80000,15)

marcopolo.description()

Sortie:
La voiture BMW M3 a un prix de 40000 eur
La voiture Mercede MarcoPolo a un prix de 80000 euros
Il a une dimension de 15 mq

0
LucianoDemuru