Pregunta Llamar a classmethod de una clase base en Python


Considera el siguiente código:

class Base(object):

    @classmethod
    def do(cls, a):
        print cls, a

class Derived(Base):

    @classmethod
    def do(cls, a):
        print 'In derived!'
        # Base.do(cls, a) -- can't pass `cls`
        Base.do(a)

if __name__ == '__main__':
    d = Derived()
    d.do('hello')

> $ python play.py  
> In derived! 
> <class '__main__.Base'> msg

De Derived.do¿Cómo llamo? Base.do?

Yo normalmente usaría super o incluso el nombre de la clase base directamente si este es un método de objeto normal, pero aparentemente no puedo encontrar una manera de llamar al método de clase en la clase base.

En el ejemplo anterior, Base.do(a) huellas dactilares Base clase en lugar de Derived clase.


76
2017-08-12 23:07


origen


Respuestas:


Si está utilizando una clase de estilo nuevo (es decir, deriva de object en Python 2, o siempre en Python 3), puedes hacerlo con super() Me gusta esto:

super(Derived, cls).do(a)

Así es como invocaría el código en la versión de la clase base del método (es decir, print cls, a), de la clase derivada, con cls siendo configurado a la clase derivada.


86
2017-08-12 23:09



esto ha pasado un tiempo, pero creo que puedo haber encontrado una respuesta. Cuando decora un método para convertirse en un método de clase, el método desatado original se almacena en una propiedad llamada 'im_func':

class Base(object):
    @classmethod
    def do(cls, a):
        print cls, a

class Derived(Base):

    @classmethod
    def do(cls, a):
        print 'In derived!'
        # Base.do(cls, a) -- can't pass `cls`
        Base.do.im_func(cls, a)

if __name__ == '__main__':
    d = Derived()
    d.do('hello')

10
2018-04-15 21:01



Esto funciona para mí:

Base.do('hi')

-2
2017-08-12 23:12