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 __== '__main__':
d = Derived()
d.do('hello')
> $ python play.py
> In derived!
> <class '__main__.Base'> msg
Dans 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 trouve pas un moyen d'appeler la méthode de classe dans la classe de base.
Dans l'exemple ci-dessus, Base.do(a)
affiche la classe Base
au lieu de la classe Derived
.
Si vous utilisez une classe de nouveau style (ie dérive de object
dans Python 2, ou toujours dans Python 3), vous peut le faire avec super()
comme ceci:
super(Derived, cls).do(a)
Voici comment vous invoqueriez le code dans la version de la classe de base de la méthode (c'est-à-dire print cls, a
), de la classe dérivée, avec cls
étant défini sur la classe dérivée.
cela fait un moment, mais je pense que j'ai peut-être trouvé une réponse. Lorsque vous décorez une méthode pour qu'elle devienne une méthode de classe, la méthode non liée d'origine est stockée dans une propriété nommée '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 __== '__main__':
d = Derived()
d.do('hello')