|
发表于 2023-6-4 17:05:09
|
显示全部楼层
不完全是。这个例子中,装饰器函数 add 、 cube 和 square 都返回的是内部定义的 inner 函数,这个 inner 函数中执行的 func() ,其实是执行的上一个装饰器返回的 inner 函数。
当我们执行 print(test()) 时:
1. test() 现在其实是 add 装饰器返回的 inner 函数,这个 inner 函数中的 x = func() 是执行的 cube 装饰器返回的 inner 函数,这个 inner 函数中的 x = func() 是执行的 square 装饰器返回的 inner 函数,而这个 inner 函数中的 x = func() 执行的就是原始的 test 函数,即返回2。
2. 当执行完原始的 test 函数后,我们有了 x=2 ,然后回到 square 装饰器返回的 inner 函数,执行 x * x ,得到 4 ,这就是 square(test()) 的结果。
3. 接着,回到 cube 装饰器返回的 inner 函数,执行 x * x * x ,此时 x=4 ,所以 cube(square(test())) 的结果是 64 。
4. 最后,回到 add 装饰器返回的 inner 函数,执行 x + 1 ,此时 x=64 ,所以 add(cube(square(test()))) 的结果是 65 。
因此,你的理解有一点需要修正,实际上在 cube 和 add 的 inner 函数中, x = func() 执行的是前一个装饰器返回的 inner 函数,而不是直接执行的 test 函数。 |
|