簡體   English   中英

如何擴展 class 方法

[英]How to extend class method

SubClassASubClassB都是Base class 的子類(都繼承自同一個Base類)。 由於getInfo()方法是在Base() class 中聲明的,因此它(此方法)在 A 和 B 子類之間共享。 getInfo()方法時,它返回self.attr變量的值(在 A 和 B 子類之間共享)。 現在我想“擴展”這個方法。 因此,當除了self.attr之外還使用instanceA.getInfo()通過 subClassA 實例調用它時,它也會返回self.attrA 同樣,如果使用 instanceB:除了返回self.attr之外,還返回instanceB.getInfo() self.attrB 如何擴展Base()類的方法getInfo()以便為子類 A 和 B 都“定制”它?

class Base(object):
    def __init__(self):
        super(Base, self).__init__()
        self.attr='Attr'

    def getInfo(self):
        info=self.getAttr()
        return info
    def getAttr(self):
        return self.attr

class SubClassA(Base):
    def __init__(self):
        super(SubClassA, self).__init__()  
        self.attrA='attrA'      
    def getAttrA(self):
        return self.attrA

class SubClassB(Base):
    def __init__(self):
        super(SubClassB, self).__init__()  
        self.attrB='attrB'      
    def getAttrB(self):
        return self.attrB

instanceA=SubClassA()
instanceB=SubClassB()
print instanceA.getInfo()
print instanceB.getInfo()

只需在子類中定義getInfo方法即可。 如果需要,使用super (就像在構造函數中一樣)來獲取基類getInfo()並根據需要合並它。

詳細說明:當給定某個類C的實例c並要求查找屬性c.attr ,Python會在一系列位置中查找該屬性。 特別是,它將在基類之前查找派生類。 這樣下面的代碼

class Base(object):
    def method(self):
        return "I'm a base object!"

class Derived(Base):
    def method(self):
        return "I'm a derived object!"

obj = Derived()
print obj.method()

將打印“我是派生對象!”,因為Python在Derived中查找method ,找到它,並且從不在Base檢查。

您提到需要在Derived對象中調用Base.method 這就是super進來的地方。 super(Derived, self).method()會在self Base.method找到並調用Base.method 您已經在構造函數中執行此操作。

例如:

class Computer(object):
    def boot_message(self):
        return 'I am a computer'

class AppleComputer(Computer):
    def boot_message(self):
        return super(AppleComputer, self).boot_message() + ' with a really shiny logo'

我們通過獲取其結果並根據需要進行修改來避免在Computer.boot_message重復工作。

注意, super(Base, self).__init__()行不是必需的; 通常,只有當基類__init__()確實有效時,派生類__init__()才能在沒有代碼重復的情況下完成這種調用,而object不是這種情況。

另一個選項是您可以返回兩個屬性:

return self.attr, self.attrA

此外,除了 .nethreeseven 之外,另一種方法是您可以使用 attrA 數據擴展 attr 數據本身,例如在列表中或添加到字符串中,然后返回它。

或者您可以遞歸地或使用裝飾器調用您擁有的兩種方法,這可能如下所示。 直接訪問(並重新定義)class 的定義

您可以獲得帶有func屬性的原始 function: ClassName.function_name = decorator(ClassName.function_name.__func__)

來自如何在 python 中“事后”將裝飾器附加到 function? (Martijn Pieters 在功能/裝飾器領域回答問題)

暫無
暫無

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

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