[英]Borrowing class method from another class (Python 3)
從另一個類借用實例方法的實現很簡單,但是如何使用類方法來實現呢?
class A:
def im(self):
print(self.__class__.__name__)
@classmethod
def cm(cls):
print(cls.__name__)
class B:
im = A.im
cm = A.cm # line X
classmethod(cm)
B().im() # B - OK
B.cm() # A - not what I want
我還嘗試將X行更改為cm = A.cm.__func__
,這導致TypeError: cm() missing 1 required positional argument: 'cls'
訪問A.cm
,您將classmethod
對象作為描述符調用,這意味着它已經綁定到A
類。 再次解開包裝:
class B:
cm = classmethod(A.cm.__func__)
.__func__
屬性使您可以訪問原始函數,因此可以使用新的classmethod
調用重新包裝它。
或者,使用A.__dict__
映射來獲取實際的類方法本身,從而繞過描述符調用:
class B:
cm = A.__dict__['cm']
你需要:
class B:
im = A.im
cm = classmethod(A.cm.__func__)
當您訪問A.cm
,生成的類方法已經“知道”它屬於A。如果要為另一個類重新包裝,則需要使用__func__
提取基礎函數,然后使用classmethod
對其進行重新包裝。
另外,在您的示例中, classmethod(cm)
不執行任何操作,因為您沒有將結果分配給任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.