4

追加の引数を渡す機能を備えた、Python クラスで動作するデコレータ関数を作成したいと考えています。クラスがインスタンス化される前にそれを行いたいです。これが私のアプローチです:

def register(x,a):
    print x,a

@register(5)
class Foo(object):
    pass

xクラスと追加aの引数です。しかし、私は

TypeError: register() takes exactly 2 arguments (1 given)

私が欲しいのは、クラスがインスタンス化される前にFoo、クラスが定義された時点でクラスと追加の引数を取得する方法です。

4

1 に答える 1

6

このようにする必要があります:

def makeDeco(a):
    def deco(cls):
        print cls, a
        return cls
    return deco

>>> @makeDeco(3)
... class Foo(object):
...     pass
<class '__main__.Foo'> 3

などを使用functools.wrapsしてそれを整えることができますが、それがアイデアです。デコレータを返す関数を書く必要があります。外側の「デコレータ作成」関数はa引数を取り、内側のデコレータ関数はクラスを取ります。

それが機能する方法は、あなたがそれを書くとき@makeDeco(3)に呼び出すことmakeDeco(3)です。の戻り値makeDeco、デコレータとして使用されるものです。makeDecoそのため、デコレータとして使用する関数を返す必要があります。

于 2013-03-22T07:07:05.663 に答える