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. De la clase derivada de nivel más bajo, cuál es la sintaxis para llamar a un método 2 niveles de la jerarquía, por ejemplo, un super.super llamar? La clase "media" no implementa el método que necesito llamar.
4 answers
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 lo mejor que Python tiene a menos que me equivoque. Lo que estás pidiendo suena anti-pitónico y tendrías que explicar por qué lo estás haciendo para que te demos la forma feliz de hacer las cosas en Python.
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 puedes ver, Parent
no implementa my_method
pero Child
todavía puede usar super para obtener el método que Parent
"ve", es decir, Grandparent
's my_method
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-05 16:29:22
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()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-18 09:00:52
Puede hacer esto siguiendo las siguientes formas
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 el Hijo llamará a la clase base my_method pero la clase base my_method no está presente allí, por lo que llamará a la clase base de la clase padre my_method de esta manera podemos llamar a la función my_method de grandparent
Otro Camino
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 clase base my_method de la función clase padre
Otra manera pero no pitónico way
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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-28 02:35:26
Si quieres subir dos niveles, ¿por qué no 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 colocarlo en bucle si sus clases medias tienen herencia múltiple. El anidamiento de super no funciona porque el tipo de super no es el tipo padre.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-29 17:40:59