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 supero 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 Baseclase en lugar de Derivedclase.
python
class
overriding
class-method
Sridhar Ratnakumar
fuente
fuente

Respuestas:
Si está utilizando una clase de nuevo estilo (es decir, deriva de
objecten 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 laclsconfiguración de la clase derivada.fuente
superen 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 loclsmismo queDerived?Derivedpero 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
clsargumento a continuación, se une aBaseen lugar deDerived