在Python中调用基类的类方法

Rei*_*ica 93 python overriding class class-method

请考虑以下代码:

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
Run Code Online (Sandbox Code Playgroud)

Derived.do,我该如何打电话Base.do

super如果这是一个普通的对象方法,我通常会直接使用甚至是基类名,但显然我找不到在基类中调用classmethod的方法.

在上面的例子中,Base.do(a)print Base类而不是Derived类.

Dav*_*d Z 111

如果您使用的是新式类(即从objectPython 2 派生,或者总是在Python 3中派生),您可以这样做super():

super(Derived, cls).do(a)
Run Code Online (Sandbox Code Playgroud)

这就是如何print cls, a从派生类调用基类的方法版本(即)中的代码,并将cls其设置为派生类.

  • 呃呃..我怎么也不会发现我可以在课堂上使用`super`. (7认同)

Nik*_*las 14

这已经有一段时间了,但我想我可能已经找到了答案.当您将方法修饰为类方法时,原始的未绑定方法存储在名为"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')
Run Code Online (Sandbox Code Playgroud)

  • 注意:此方法适用于 super() 不起作用的旧样式类 (2认同)
  • 在 python 2.7 和 3 中也可用作 `__func__` (2认同)