Considere 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
, como llamo 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 Base
clase en lugar de Derived
clase.
python
class
overriding
class-method
Sridhar Ratnakumar
fuente
fuente
Respuestas:
Si está utilizando una clase de nuevo estilo (es decir, deriva de
object
en Python 2, o siempre en Python 3), puede hacerlosuper()
así:Así es como se invocaría el código en la versión del método de la clase base (es decir
print cls, a
), desde la clase derivada, con lacls
configuración de la clase derivada.fuente
super
en métodos de clase.object
. (al menos en Python 2, pero en Py3 creo que todas las clases son de nuevo estilo, IIRC) De lo contrarioBase.do(self, ...)
, creo que tienes que hacerlo , codificando así el nombre de la superclase.Derived.do()
, ¿no es locls
mismo queDerived
?Derived
pero no de una subclase, entonces sí.esto ha pasado un tiempo, pero creo que he encontrado una respuesta. Cuando decoras un método para convertirlo en un método de clase, el método independiente original se almacena en una propiedad llamada 'im_func':
fuente
__func__
en python 2.7 y 3Esto funciona para mi:
fuente
cls
argumento a continuación, se une aBase
en lugar deDerived