126 votes

L'appel d'une classe de base classmethod en Python

Considérons 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

D' Derived.do, comment dois-je appeler Base.do? Je voudrais l'utiliser normalement super ou même le nom de classe de base directement si cela est une méthode de l'objet, mais apparemment je ne peux pas trouver un moyen d'appeler la classmethod dans la classe de base. Dans l'exemple ci-dessus, Base.do(a) tirages Base classe au lieu d' Derived classe.

141voto

David Z Points 49476
super(Derived, cls).do(a)

EDIT: Oh, attendez une minute... c'est pas clair exactement ce que vous demandez. Voici comment vous pouvez invoquer le code dans la classe de base de la version de la méthode, de la classe dérivée.

17voto

Nikolas Points 133

cela a été un moment, mais je pense que j'ai peut-être trouvé une réponse. Lorsque vous décorez une méthode pour devenir un classmethod l'original unbound méthode est stockée dans une propriété appelé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 __name__ == '__main__':
    d = Derived()
    d.do('hello')

-4voto

Ned Batchelder Points 128913

Cela fonctionne pour moi:

Base.do('hi')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X