1

インスタンス メソッドの実装を別のクラスから借用するのは簡単ですが、クラス メソッドではどのようにすればよいのでしょうか?

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

cm = A.cm.__func__また、行 X を に変更してみました。TypeError: cm() missing 1 required positional argument: 'cls'

4

2 に答える 2

4

にアクセスするときは、オブジェクトを記述子A.cmとして呼び出します。これは、オブジェクトが既にクラスにバインドされていることを意味します。もう一度アンラップします:classmethodA

class B:
    cm = classmethod(A.cm.__func__)

この.__func__属性を使用すると、元の関数にアクセスできるため、新しいclassmethod呼び出しで再ラップできます。

A.__dict__または、マッピングを使用して実際のクラスメソッド自体を取得し、記述子呼び出しをバイパスします。

class B:
    cm = A.__dict__['cm']
于 2013-06-27T07:56:58.267 に答える
3

必要なもの:

class B:
  im = A.im
  cm = classmethod(A.cm.__func__)

にアクセスするA.cmと、結果の classmethod はそれが A に属していることを既に「認識」しています。別のクラス用に再ラップする場合は、基になる関数を で抽出してから で再ラップする必要があり__func__ますclassmethod

また、あなたの例ではclassmethod(cm)、結果を何にも割り当てていないため、行は何もしません。

于 2013-06-27T07:55:57.803 に答える