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 回答