[英]How to extend class method
SubClassA
和SubClassB
都是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.