Considérez le code suivant:
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
, comment appeler Base.do
?
J'utiliserais normalement super
ou même le nom de la classe de base directement s'il s'agit d'une méthode d'objet normale, mais apparemment, je ne peux pas trouver un moyen d'appeler la méthode de classe dans la classe de base.
Dans l'exemple ci-dessus, Base.do(a)
imprime la Base
classe au lieu de la Derived
classe.
python
class
overriding
class-method
Sridhar Ratnakumar
la source
la source
Réponses:
Si vous utilisez une classe de nouveau style (c'est-à-dire dérivée de
object
Python 2, ou toujours de Python 3), vous pouvez le fairesuper()
comme ceci:C'est ainsi que vous invoqueriez le code dans la version de la classe de base de la méthode (c'est-à-dire
print cls, a
), à partir de la classe dérivée, encls
étant défini sur la classe dérivée.la source
super
à l'esprit que je puisse aussi utiliser des méthodes de classe.object
. (au moins en Python 2, mais en Py3, je pense que toutes les classes sont de nouveau style, IIRC) Sinon, vous devez le faireBase.do(self, ...)
, je pense, codant ainsi en dur le nom de la superclasse.Derived.do()
, n'est-ce pascls
la même choseDerived
?Derived
mais pas d'une sous-classe, alors oui.cela fait un moment, mais je pense avoir trouvé une réponse. Lorsque vous décorez une méthode pour qu'elle devienne une méthode de classe, la méthode indépendante d'origine est stockée dans une propriété nommée 'im_func':
la source
__func__
en python 2.7 et 3Cela fonctionne pour moi:
la source
cls
argument sera alors lié à laBase
place deDerived