考虑以下代码:
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
类而不是Derived
类。
发布于 2009-08-12 23:09:51
如果你正在使用一个新风格的类(即派生自Python2中的object
,或者总是派生在Python3中),你可以像这样使用super()
:
super(Derived, cls).do(a)
这就是如何在将cls
设置为派生类的情况下,从派生类调用基类版本的方法(即print cls, a
)中的代码。
发布于 2011-04-16 05:01:50
这已经有一段时间了,但我想我可能已经找到了答案。当你修饰一个方法成为一个类方法时,原始的未绑定方法被存储在一个名为‘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')
发布于 2020-10-13 16:09:07
基于@David Z的答案,使用:
super(Derived, cls).do(a)
它可以进一步简化为:
super(cls, cls).do(a)
我经常使用类方法来提供构造对象的替代方法。在下面的示例中,我对类方法load使用了与上面一样的超级函数,它改变了对象的创建方式:
class Base():
def __init__(self,a):
self.a = a
@classmethod
def load(cls,a):
return cls(a=a)
class SubBase(Base):
@classmethod
def load(cls,b):
a = b-1
return super(cls,cls).load(a=a)
base = Base.load(a=1)
print(base)
print(base.a)
sub = SubBase.load(b=3)
print(sub)
print(sub.a)
输出:
<__main__.Base object at 0x128E48B0>
1
<__main__.SubBase object at 0x128E4710>
2
https://stackoverflow.com/questions/1269217
复制相似问题