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

Ale*_*lex 4 python decorator python-2.7

我想创建一个装饰器函数来操作python类,并能够传递其他参数.我想在类实例化之前这样做.这是我的方法:

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

@register(5)
class Foo(object):
    pass
Run Code Online (Sandbox Code Playgroud)

与x作为类a的附加参数.但我得到了一个

TypeError: register() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)

我想要的是Foo在实例化类之前,在定义类时获取类和其他参数的某种方法.

Bre*_*arn 6

你需要这样做:

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

>>> @makeDeco(3)
... class Foo(object):
...     pass
<class '__main__.Foo'> 3
Run Code Online (Sandbox Code Playgroud)

你可以使用functools.wraps等等来修饰它,但这就是主意.您需要编写一个返回装饰器的函数.外部"装饰器制作"函数接受a参数,内部装饰器函数接受类.

它的工作方式是当你写@makeDeco(3)它时makeDeco(3).该返回值的makeDeco就是被用作装饰.这就是为什么你需要makeDeco返回你想用作装饰器的函数.