首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中调用基类的类方法

在Python中调用基类的类方法
EN

Stack Overflow用户
提问于 2009-08-12 23:07:23
回答 4查看 50.1K关注 0票数 122

考虑以下代码:

代码语言:javascript
复制
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类。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-12 23:09:51

如果你正在使用一个新风格的类(即派生自Python2中的object,或者总是派生在Python3中),你可以像这样使用super()

代码语言:javascript
复制
super(Derived, cls).do(a)

这就是如何在将cls设置为派生类的情况下,从派生类调用基类版本的方法(即print cls, a)中的代码。

票数 138
EN

Stack Overflow用户

发布于 2011-04-16 05:01:50

这已经有一段时间了,但我想我可能已经找到了答案。当你修饰一个方法成为一个类方法时,原始的未绑定方法被存储在一个名为‘im_func’的属性中:

代码语言:javascript
复制
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')
票数 16
EN

Stack Overflow用户

发布于 2020-10-13 16:09:07

基于@David Z的答案,使用:

代码语言:javascript
复制
super(Derived, cls).do(a)

它可以进一步简化为:

代码语言:javascript
复制
super(cls, cls).do(a)

我经常使用类方法来提供构造对象的替代方法。在下面的示例中,我对类方法load使用了与上面一样的超级函数,它改变了对象的创建方式:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
<__main__.Base object at 0x128E48B0>
1
<__main__.SubBase object at 0x128E4710>
2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1269217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档