如何使用@符号在python中修饰函数
下面是我想在代码中执行的一个简单示例:如何使用@符号在python中修饰函数,python,closures,decorator,Python,Closures,Decorator,下面是我想在代码中执行的一个简单示例: def deco(func): def inner(x): num = func.__closure__[0].cell_contents print("I multiply with " + str(num)) return func(x) return inner def make_multiplier_of(n): def multiply(x): retur
def deco(func):
def inner(x):
num = func.__closure__[0].cell_contents
print("I multiply with " + str(num))
return func(x)
return inner
def make_multiplier_of(n):
def multiply(x):
return x*n
return multiply
multi7 = make_multiplier_of(7)
multi7 = deco(multi7)
print(multi7(5))
这个运行得很好
但如果我将代码更改为:
@deco
def make_multiplier_of(n):
def multiply(x):
return x*n
return multiply
我得到一个错误:
num = func.__closure__[0].cell_contents
TypeError: 'NoneType' object is not subscriptable
我如何解决这个问题?/使用@符号修饰我的函数?当你使用装饰器时,
func
参数是make\u multiplier\u of
而不是multiply
,这就是func.\uu closure\u0]的原因。单元格内容
抛出异常
如果你能更换装饰师,这里有个解决办法
def deco(func):
def inner(x):
print("I multiply with " + str(x))
return func(x)
return inner
@deco
def make_multiplier_of(n):
def multiply(x):
return x*n
return multiply
multi7 = make_multiplier_of(7)
print(multi7(5))
小心使用行为,因为multi7=deco(multi7)
将发生变化
最好的祝愿我想说的一个主要问题是,你的装饰师希望知道太多的内部装饰细节。首先,它可能不应该玩弄实现细节,比如
\uuuu closure\uuuu
。我发现记住@deco
实际上是make\u multiplier\u of=deco(make\u multiplier\u of)