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其设置为派生类.
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)