有没有大佬帮我看看我的疑问
Topic source还有一个疑问就是:
now = log(now)
由于log()
是一个decorator,返回一个函数,所以,原来的now()
函数仍然存在,只是现在同名的now
变量指向了新的函数,于是调用now()
将执行新函数,即在log()
函数中返回的wrapper()
函数。
这中间讲的now指向一个新函数,那Python解释器是怎么知道调用now时是调用新函数还是旧函数
1. 修饰器的作用是增强函数的功能。用你的方法,fn依然指向fn本身,没有变化。
2. 调用哪个函数取决于你的代码。在def now()上面一行加了@修饰器,就会调用新函数。def now()上面没有修饰器,就不存在新函数了。
@log 好像是对之后定义的函数如func(),将func()传入到定义的log函数中,执行一次log函数,然后将返回的值重新赋给func,如下:
>>> def log(func):
print(func.__name__)
return "a"
>>> @log
def funct():
pass
funct
>>> print(funct)
a
>>> funct
'a'
可以看到@log 后定义完函数后执行了print(func.__name__),输出了函数名funct,定义的函数再也变成了log函数的返回值"a"。这也是为什么“经过decorator装饰之后的函数,它们的__name__
已经从原来的'now'
变成了'wrapper'
”。
所以这样的语法下就应该需要定义一个wrapper()这样的函数。
看完我也是似懂非懂,自己去试过了才明白这都是什么,还是要看看大佬们的评论。
- 1
你好谢谢再见110
为什么要多此一举的写def wrapper(): return func()呢?
直接写成这样不就好了?
def metric(fn):
print('%s executed in %s ms' % (fn.__name__, 10.24))
return fn
难道装饰器非要加上wrapper()才能算装饰器吗?直接写成后者并且在函数fn()前@难道不算装饰器吗?