method python class override class-method

Llamar a classmethod de una clase base en Python



super python 3 (3)

Esto funciona para mí:

Base.do(''hi'')

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

Desde Derived.do , ¿cómo llamo a Base.do ?

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) imprime la clase Base lugar de la clase Derived .


Si está utilizando una clase de estilo nuevo (es decir, deriva de un object en Python 2, o siempre en Python 3), puede hacerlo con super() esta manera:

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 ), desde la clase derivada, con cls se configuran en la clase derivada.


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'')