如何在python类上创建带参数的decorator函数?
我想创建一个decorator函数来操作python类,并能够传递额外的参数。我想在类被实例化之前这样做。我的做法如下:如何在python类上创建带参数的decorator函数?,python,python-2.7,decorator,Python,Python 2.7,Decorator,我想创建一个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和其他参
def register(x,a):
print x,a
@register(5)
class Foo(object):
pass
类为x
,附加参数为a
。但是我有一个
TypeError: register() takes exactly 2 arguments (1 given)
我想要的是某种方法,在类被实例化之前,在类被定义时,获取类
Foo
和其他参数 您需要这样做:
def makeDeco(a):
def deco(cls):
print cls, a
return cls
return deco
>>> @makeDeco(3)
... class Foo(object):
... pass
<class '__main__.Foo'> 3
def makeDeco(a):
def装饰(cls):
打印cls,a
返回cls
返回装饰
>>>@makeDeco(3)
... 类Foo(对象):
... 通过
3.
您可以使用functools.wrapps
等工具来美化它,但这正是我们的想法。您需要编写一个返回装饰器的函数。外部“decorator making”函数接受a
参数,内部decorator函数接受类
它的工作方式是,当您编写
@makeDeco(3)
时,它调用makeDeco(3)
。makeDeco
的返回值用作装饰器。这就是为什么需要makeDeco
返回要用作装饰器的函数。如果要这样做,您不需要定义接受两个参数的装饰器。您定义了一个接受一个参数的函数(您的a
),并使该函数返回一个接受一个参数的装饰器(类)。但当我用一个参数定义函数时,它就是类!只需删除两次上面的,a
,输出为
。@ArtsiomRudzenka的解决方案可能与您的解决方案相同,需要另一个嵌套函数才能使用@wraps
@Bren:我想这就是我需要的。但有一个问题。python如何知道内部函数deco
是一个装饰器?它只是外部函数中的任何函数吗?@Alex:@
后面表达式的返回值用作修饰符。调用makeDeco(3)
返回一个函数,因此该函数被用作装饰器。注意return-deco
内部的makeDeco
。是的,没错,我不知何故误读了第二个return
语句所属的位置。。。