¿Cómo llamar a super método de la clase de nieto?

Estoy trabajando con un código que tiene 3 niveles de herencia de clase. Desde la clase derivada de nivel más bajo, ¿cuál es la syntax para llamar a un método 2 para elevar la jerarquía, por ejemplo, una llamada super.super? La clase “media” no implementa el método que necesito llamar.

Bueno, esta es una forma de hacerlo:

 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) 

Tal vez no sea lo que quieres, pero es lo mejor que tiene Python a menos que esté equivocado. Lo que estás preguntando suena antipythonico y tendrías que explicar por qué lo haces para que te demos la manera feliz de hacer las cosas con los pitones.

Otro ejemplo, tal vez lo que quieres (de tus comentarios):

 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() 

Como puede ver, Parent no implementa my_method pero Child todavía puede usar super para obtener el método que Parent “ve”, es decir, my_method .

Esto funciona para mí:

 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() 

Fabricado y probado en 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() 

Salida:
El coche BMW M3 tiene un precio de 40000 eur.
El coche Mercede MarcoPolo tiene un precio de 80000 eur.
Tiene una dimensión de 15 mq.

Puedes hacerlo de la siguiente manera

 class Grandparent(object): def my_method(self): print "Grandparent" class Parent(Grandparent): def my_other_method(self): print "Parent" class Child(Parent): def my_method(self): print "Inside Child" super(Child, self).my_method() 

En este caso, Child llamará a la clase base my_method, pero la clase base my_method no estará presente allí, por lo que llamará a la clase base de la clase primaria my_method de esta manera podemos llamar a my_method la función de abuelo

De otra manera

 class Grandparent(object): def my_method(self): print "Grandparent" class Parent(Grandparent): def my_other_method(self): print "Parent" class Child(Parent): def my_method(self): print "Inside Child" super(Parent, self).my_method() 

De esta manera, estamos llamando directamente a la función base class my_method function de la clase principal

Otra forma pero no de forma pythonica.

 class Grandparent(object): def my_method(self): print "Grandparent" class Parent(Grandparent): def my_other_method(self): print "Parent" class Child(Parent): def my_method(self): print "Inside Child" Grandparent.my_method() 

De esta manera, estamos llamando directamente a la función my_method especificando el nombre de la clase.

Si quieres subir dos niveles, ¿por qué no hacerlo?

 class GrandParent(object): def act(self): print 'grandpa act' class Parent(GrandParent): def act(self): print 'parent act' class Child(Parent): def act(self): super(Child.__bases__[0], self).act() print 'child act' instance = Child() instance.act() # Prints out # >>> grandpa act # >>> child act 

Puedes agregar algo a la defensiva, como verificar si __bases__ está vacío o hacer un bucle si tus clases medias tienen herencia múltiple. Anidar super no funciona porque el tipo de super no es el tipo principal.