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.