簡體   English   中英

在 Python 中調用基類的類方法

[英]Calling a base class's classmethod in 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 class 而不是Derived class。

如果您使用的是新式類(即派生自 Python 2 中的object ,或始終在 Python 3 中),您可以像這樣使用super()

super(Derived, cls).do(a)

這就是您將如何從派生類調用基類版本的方法(即print cls, a )中的代碼,並將cls設置為派生類。

這已經有一段時間了,但我想我可能已經找到了答案。 當你裝飾一個方法成為一個類方法時,原始未綁定的方法存儲在一個名為“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')

基於@David Z 的回答,使用:

super(Derived, cls).do(a)

可以進一步簡化為:

super(cls, cls).do(a)

我經常使用類方法來提供構造對象的替代方法。 在下面的示例中,我將上面的超級函數用於類方法加載,它改變了創建對象的方式:

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

這對我有用:

Base.do('hi')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM