2


0

どのクラスでデコレータを初期化しているのか、どうすればわかりますか? デコレータはまだクラスにバインドされていないので、これを見つけることができないことは理にかなっていますが、これを回避する方法はありますか?

クラスA(オブジェクト):def dec(f):#私はクラス 'A'にいるdef func(cls):f(cls)return func

@dec def test(self):合格

自分がどのクラスであるかを知る必要があります(コメント付きの行で示されています)。

3 Answer


3


これは可能だとは思わない。 testを定義した瞬間には、そのクラスはまだ存在していません。

Pythonが遭遇したとき

クラスA(オブジェクト):

それはそれがそれがそれがクラス定義で見つけた全てのコード(test()の定義とデコレータへの呼び出しを含む)を実行する新しい名前空間を作成し、そしてそれが完了すると、それは新しいクラスオブジェクトを作成しそして全てをこの中に入れるコードが実行された後に名前空間に残されたクラス。

そのため、デコレータが呼ばれたとき、それはまだ何も知りません。 現時点では、testは単なる機能です。


0


私は質問を受けません。

>>> class A(object):
    def dec(f):
        def func(cls):
            print cls
        return func

    @dec
    def test(self):
        pass

>>> a=A()
>>> a.test()
<__main__.A object at 0x00C56330>
>>>

引数( + cls +)はクラス `+ A +`です。


0


ナディアが指摘したように、あなたはより具体的である必要があるでしょう。 Pythonはこのようなことを許可していません。つまり、あなたがやろうとしていることはおそらく何か悪いことです。

それまでの間、これが私の貢献です。船乗りとカエルについての小さな物語です。 (クラス初期化の後に_コンストラクタを使う)

クラスCruise(object):def arewelostyet(self):print '若い船員:私は迷っていると思います、助けてください:s'

instance = Cruise()

instance.arewelostyet()

デフwhereami(lostfunc): "" "デコレータ" ""デフ飾り(* args、** kwargs):lostfunc(* args、** kwargs) あなたはクラスでのセーリング '、lostfunc.im_class .__ name__

#名前とドキュメントの書き込みを忘れないでください。decoct.func_name = lostfunc.func_name decoration.func_doc = lostfunc.func_name

戻り装飾

カエルがどこからも飛び出さない[/ i]

#メソッドを装飾します。Cruise.arewelostyet = whereami(Cruise.arewelostyet)

instance.arewelostyet()