本帖最后由 jackz007 于 2024-5-3 22:25 编辑
这两句:
把函数 func() 作为 delay() 的被装饰对象;
def fib():
. . . . . .
def func():
. . . . .
return func
fib() 返回的是其内置函数 func() 的调用句柄,那么,下面这一句:
就会获得对 fib() 内置函数 func() 的调用句柄,下面的语句:
就是在调用 fib() 的内置函数 func()
根据装饰器的运行机制,delay() 装饰了 func(),当每次通过 f() 调用 func() 的时候,会把调用转向到 delay(),并由 delay() 来完成对 func() 的实际调用。这样,每次调用 f() 都会经历由 delay() 产生的时间延迟。
如果改让 delay() 装饰 fib(),那么,在调用 fib() 的时候,会转向到调用 delay(),再由 delay() 来完成对 fib() 的实际调用,所以,只有执行这一句的时候会产生一次时间的延迟:
而在后面循环中多次调用的 f() 的时候,会直接调用未经 delay() 装饰的 func(),因而期间也不会产生任何延迟。
此外,用 delay() 装饰 fib() 还有一个问题:
def delay(func):
def funa():
time.sleep(1)
func() # <--- 问题语句:函数 funa() 实际完成对被装饰函数的调用,却没有传递函数的返回值。
return funa
调用 fib() 会返回其内置函数 func() 的调用句柄,如果用 delay() 装饰了 fib(),则会因为 funa() 无返回值,从而使这一句:
将无法取得 func() 的调用句柄,f 的值将会使 None,从而会使后续的 f() 语句非法。
如果想让delay() 装饰 fib(),则必须修改 delay()
def delay(func):
def funa():
time.sleep(1)
return func() # 修改这里
return funa