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