我想创建一个装饰器函数来操作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
的一些方法以及定义类时的其他参数,在实例化类之前。
答案 0 :(得分: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
来返回你想用作装饰器的函数。