问题:在Python中调用基类的类方法
考虑以下代码:
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
从哪里来Derived.do
,我怎么打电话Base.do
?
super
如果这是一个普通的对象方法,通常我会直接使用甚至直接使用基类名称,但是显然我找不到在基类中调用类方法的方法。
在上面的示例中,Base.do(a)
打印Base
class而不是Derived
class。
回答 0
如果您使用的是新样式的类(例如,是从object
Python 2 派生的,或者总是在Python 3中派生的),则可以这样操作super()
:
super(Derived, cls).do(a)
这是您如何在基类版本的方法(即print cls, a
)中从派生类调用代码并将cls
其设置为派生类的方式。
回答 1
这已经有一段时间了,但是我想我可能已经找到了答案。当您装饰一个方法成为类方法时,原始的未绑定方法存储在名为“ 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')
回答 2
这对我有用:
Base.do('hi')