在阅读了this article之后,我理解了装饰器以及为什么我们使用装饰器而不是子类。在那里,他们编写了以下示例,其中介绍了包装器的需求:
def uppercase_decorator(function):
def wrapper():
funct = function()
make_uppercase = funct.upper()
return make_uppercase
return wrapper
然而,我可以这样写“同样的东西”(我希望你会说它不是):
def uppercase_decorator(function): #previously 'function' was called 'message' but 'function' is clearer for comparison.
make_uppercase = function().upper
return make_uppercase
调用salute()
时:
@uppercase_decorator
def salute():
return 'Hi all!'
def decorateIt(fn):
toUpper = fn().upper
return toUpper
def decorateW(fn):
def wrapper():
funct = fn()
toUpper = funct.upper()
return toUpper
return wrapper
import random, string
@decorateIt
def sayGarbage():
return "".join(random.choice(string.ascii_lowercase) for i in range(6))
sayGarbage()
为什么会这样呢?
发布于 2019-06-20 03:46:38
让我们看看这里发生了什么:
def uppercase_decorator(message):
make_uppercase = func().upper
return make_uppercase
@uppercase_decorator
def salute():
return 'Hi all!'
首先,通过在第一个位置参数(message
).的位置传入函数
salute
,uppercase_decorator
获取defined.salute
获取defined.salute
uppercase_decorator
此时,代码将崩溃,因为调用了func()
,而没有在任何地方定义它。如果它在您的Python REPL会话中工作,那么您一定在前面的全局作用域中有一个名字func
,所以代码看起来只是巧合地工作。
我们真的需要装饰器的包装器吗?
不是的。可以像你建议的那样,以更好的“闭包”风格编写装饰器,但不是这样。如果您想编写一个不带嵌套函数的装饰器,请尝试使用流行的库decorator.py
。它看起来像这样:
from decorator import decorator
@decorator
def uppercase_decorator(func, *args, **kwargs):
result = func(*args, **kwargs)
return result.upper()
https://stackoverflow.com/questions/56674710
复制相似问题