这个问题在这里已有答案:
代码如下
#!/usr/bin/env python3
def my_dec(func):
def wrap(w):
t=func(w)
return t*4
return wrap
@my_dec
def testing(n):
return n
new=testing(3)
print(new) (this prints 12)
这个例子工作正常,但现在我正在尝试将以下内容添加到装饰器 @my_dec(100)
,我需要将给定数字乘以100 .
当我试试这个
@my_dec(100)
def testing(n):
return n
我得到以下内容
Traceback (most recent call last):
File "./deco2", line 10, in <module>
@my_dec(100)
File "./deco2", line 5, in wrap
t=func(w)
TypeError: 'int' object is not callable
如何将100传递给装饰者?
1 回答
在第一个示例中,您正确地将装饰器定义为接受包装函数的函数,并返回一个新函数 .
要添加参数,需要编写一个接受参数的函数,然后返回装饰器,即返回包含并返回函数的函数 .
一种方法:
如果您考虑
@
语法扩展到的内容,这可能会更加清晰:扩展为:
此外,为了降低高嵌套级别,并使装饰器更具可读性和可维护性,您可以定义一个装饰器类,它在
__init__
中获取其参数,并在其__call__
中调用包装函数 . 网上有很多例子 . 你可以先阅读this question .还有一些方法可以让你的装饰器采用可选参数(即,这样你的两个例子都可以工作) .
如果您真的想深入了解装饰器,请阅读Graham Dumpleton's blog . 强烈推荐 .