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.

Author: smci, 2015-07-05

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.

 50
Author: CrazyCasta,
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()
 13
Author: Tomasz,
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.

 -1
Author: anand tripathi,
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.

 -2
Author: IamnotBatman,
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