如何在python类上创建带有参数的装饰器函数?

时间:2013-03-22 06:56:45

标签: python python-2.7 decorator

我想创建一个装饰器函数来操作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的一些方法以及定义类时的其他参数,在实例化类之前

1 个答案:

答案 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来返回你想用作装饰器的函数。