2009-08-12 54 views
74

考虑下面的代码类方法:调用基类的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甚至直接使用基类名,但显然我找不到调用基类中的classmethod的方法。

在上例中,Base.do(a)打印Base类而不是Derived类。

+0

相关:【如何调用父类的从子类在Python的方法?(HTTP:/ /stackoverflow.com/q/805066/95735) – 2012-01-28 21:47:43

回答

83
super(Derived, cls).do(a) 

编辑:哦,等一下......目前还不清楚你问什么。这就是你如何从派生类中调用基类的方法版本中的代码。

+5

呃呃..我怎么也没有发现我可以在类方法上使用'super'。 – 2009-08-12 23:11:51

+0

这只适用于(由于super的限制)如果基础派生自对象,对吧?如果情况并非如此,你会怎么做? – 2014-06-11 19:06:23

+0

是的,这只适用于派生自'object'的新式类。 (至少在Python 2中,但在Py3中,我认为所有的类都是新式的,IIRC)否则,你必须做'Base.do(self,...)',我认为,从而硬编码的名称超类。 – 2014-06-11 19:29:41

-2

这个工作对我来说:

Base.do('hi') 
+7

'cls'参数将被绑定到'Base'而不是'Derived' – 2009-08-12 23:14:01

+0

这对我来说很有用 - 这很像Ned的回答: 其中self派生自QGraphicsView,它具有paintEvent(QPaintEvent) 高清的paintEvent(个体经营,qpntEvent): 打印目录(个体经营) QGraphicsView.paintEvent(个体经营,qpntEvent) – user192127 2012-03-31 15:54:16

10

这已经有一段时间,但我想我可能已经找到了答案。当您装饰的方法,成为原来的不受约束的方法存储在一个名为“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') 
+1

注意:此方法适用于老式类超地方()不工作 – 2011-06-02 20:36:04

+1

也可作为'__func__'在python 2.7和3中 – dtheodor 2014-04-29 20:09:12