web-dev-qa-db-fra.com

Appel de la méthode de classe d'une classe de base dans Python

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.

91
Sridhar Ratnakumar

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.

107
David Z

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