2

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

class A(object):
    def dec(f):
                # I am in class 'A'
        def func(cls):
            f(cls)
        return func

    @dec
    def test(self):
        pass

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

4

3 に答える 3

3

これは不可能だと思います。テストを定義するまさにその瞬間、クラスはまだ存在していません。

Pythonが遭遇したとき

class A(object):

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

したがって、デコレータが呼び出されたとき、それはまだ何も知りません。現時点では、テストは単なる機能です。

于 2009-06-05T18:01:20.590 に答える
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

于 2009-06-05T18:17:42.433 に答える
0

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

それまでの間、ここに私の貢献があります:船乗りとカエルについての小さな話。(クラスの初期化にコンストラクターを使用します)

class Cruise(object):
    def arewelostyet(self):
        print 'Young sailor: I think I am lost, help me :s'

instance = Cruise()

instance.arewelostyet()

def whereami(lostfunc):
    """
    decorator
    """
    def decorated(*args, **kwargs):
        lostfunc(*args, **kwargs)
        print 'Frog: Crôak! thou art sailing in class', lostfunc.im_class.__name__

    # don't forget to write name and doc
    decorated.func_name = lostfunc.func_name
    decorated.func_doc = lostfunc.func_name

    return decorated


print '[i]A frog pops out of nowhere[/i]'

# decorate the method:
Cruise.arewelostyet = whereami(Cruise.arewelostyet)

instance.arewelostyet()
于 2009-06-06T11:30:38.280 に答える