2017-03-28 5 views
1

Supposons que nous avons ci-dessous chaîne d'héritage:Comment appeler une méthode de la classe de base de quelques niveaux dans la chaîne d'héritage?

class Base: 
    def method(self): 
     # … 

class Derived1(Base): 
    def method(self): 
     # … 

class Derived2(Derived1): 
    pass 

class Derived3(Derived2): 
    def method(self): 
     # … 

Le problème: Je voudrais définir en quelque sorte method dans Derived3 pour qu'il appelle lui-même de Base.

Normalement, je voudrais juste écrire:

class Derived3(Derived2): 
    super().method() 

Mais ce appelleraient method de Derived1, ce qui est exactement ce que je veux éviter. Je veux appeler method de Base.

Répondre

1

Vous pouvez appeler explicitement un membre de la superclasse, en passant simplement self comme premier argument:

Base.method(self) 

Exemple complet:

class Derived3(Derived2): 
    def method(self): 
     Base.method(self) 

Cela exécutera Base.method sur l'instance spécifiée par self, qui est passé automatiquement à Derived3.method lorsqu'il est accédé through an instance.

1

La plus simple approche consiste à appeler la méthode Base directement, en passant self explicitement:

Base.method(self) 

Si l'objectif est de passer à « tout ce qui est après une classe super mal connue dans le MRO » bien, vous pouvez utiliser super avec des arguments explicites pour agir comme si elle était appelée à partir de la "mauvaise super classe" afin qu'elle passe à "tout ce qui vient après":

class Derived3(Derived2): 
    def method(self): 
     # Call method from next class after Derived1 in MRO, which happens to be Base 
     # Using super means the method is bound, so self passed implicitly to method 
     super(Derived1, self).method()