鱼C论坛

 找回密码
 立即注册
查看: 105|回复: 4

有关装饰器问题

[复制链接]
发表于 2021-1-7 10:08:48 From FishC Mobile | 显示全部楼层 |阅读模式
16鱼币
装饰器前面的函数为什么要弄成闭包啊,普通函数也可以实现啊

65A3DF99-2DAA-420E-BD7A-92DB7DC90FB4.png
9C0485D8-3A32-4860-8EE7-E2152278F686.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-1-7 10:21:52 | 显示全部楼层
看起来只是进行了定义,没有调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-1-7 10:22:45 | 显示全部楼层
你还没执行被装饰的函数呢

即便如此

  1. def decorator(f):
  2.   print("my decorator")
  3.   return f

  4. @decorator
  5. def myfunc():
  6.   print("my function")

  7. myfunc()
  8. myfunc()
  9. myfunc()
复制代码


输出是
my decorator
my function
my function
my function

print('my decorator')由于不在return的函数里 只在第一次@的时候执行一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-1-7 10:43:58 From FishC Mobile | 显示全部楼层
kogawananari 发表于 2021-1-7 10:22
你还没执行被装饰的函数呢

即便如此

我知道了,如果是闭包的话@后面那个返回的是一个新的空间,而我这么弄,在@定义后已经执行了,再次用test()就会报错,因为test指向了@前面的函数而它需要一个参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-1-7 12:00:22 | 显示全部楼层
v.ki 发表于 2021-1-7 10:43
我知道了,如果是闭包的话@后面那个返回的是一个新的空间,而我这么弄,在@定义后已经执行了,再次用test ...
  1. def a(x):
  2.     def b(y):
  3.         return x*y
  4.     return b

  5. num = a(1)      #此处num 等于个一个方法引用地址
  6. print(num(10))  #此处的num(1) 展开转换的是 b(1), 因此a(x)函数中的x,在b(y)中变得可用
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2021-1-18 00:22

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表