Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python类上创建带参数的decorator函数?_Python_Python 2.7_Decorator - Fatal编程技术网

如何在python类上创建带参数的decorator函数?

如何在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和其他参

我想创建一个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 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
语句所属的位置。。。