init__ herency def comando python python-2.7 inheritance super grandchild

herency - super class self__ init__ python



¿Cómo llamar al método super de la clase nieto? (4)

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 sintaxis para llamar a un método 2 niveles en la jerarquía, por ejemplo, una llamada super.super? La clase "intermedia" 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 es lo que quieres, pero es la mejor pitón a menos que esté equivocado. Lo que estás preguntando suena antipotónico y deberías explicar por qué lo haces para que te demos la forma feliz de hacer las cosas.

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 aún 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()


Puedes hacer esto siguiendo las siguientes maneras

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á allí, por lo que llamará a la clase base de la clase padre my_method, de esta forma podemos llamar a my_method function of grandparent

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 forma, estamos llamando directamente a la clase base de funciones my_method function de la clase padre

Otra forma pero no pitonica

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 forma, llamamos directamente a la función my_method especificando el nombre de la clase.


Si quiere subir dos niveles, ¿por qué no simplemente hacer

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

Puede agregar algo defensivo como verificar si __bases__ está vacío o __bases__ si sus clases medias tienen herencia múltiple. Nesting super no funciona porque el tipo de super no es el tipo principal.