【发布时间】:2019-11-02 14:37:09
【问题描述】:
已询问similar question,但 OP 将包装器与没有返回的函数进行比较,因此答案集中在该“错误”上。
在阅读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
这两个版本都可以应用于这个 fn,在调用 salute() 时产生相同的输出('HI ALL!'):
@uppercase_decorator
def salute():
return 'Hi all!'
如果 main fn 返回一个随机字符串(感谢@wim 的建议),我们可以注意到每次运行它时,没有包装器的总是在运行sayGarbage() 行时返回相同的内容:
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()
为什么会这样?
【问题讨论】:
-
您的
uppercase_decorator版本中的message在做什么?func()哪里来的? -
完全误解了装饰器的工作原理。装饰器接收待装饰函数作为参数!
-
不同的是第二个版本不行。
-
抱歉,我错过了将 'funct' 更改为 'message'。现在它应该可以工作了
-
装饰后,敬礼现在将是方法
'Hi all!'.upper.
标签: python wrapper python-decorators