簡體   English   中英

從另一個類借用類方法(Python 3)

[英]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.

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