鱼C论坛

 找回密码
 立即注册
查看: 1834|回复: 6

[已解决]闭包和装饰器

[复制链接]
发表于 2024-4-11 10:42:47 | 显示全部楼层
本帖最后由 jackz007 于 2024-4-11 12:13 编辑

【闭包】:
  1. def fooA(a , b) :
  2.     def fooB(x , y) :
  3.         return (x + a) // (y - b)
  4.     return fooB

  5. fx1 = fooA(900 , 45)        # 以 a = 900 , b = 45 调用 fooA(a , b),得到其内嵌函数 fooB() 的调用句柄 fx1
  6. fx2 = fooA(150 , 15)        # 以 a = 150 , b = 15 调用 fooA(a , b),得到其内嵌函数 fooB() 的调用句柄 fx2
  7. print('%d' % fx1(30 , 75))  # 以 a = 900 , b = 45 , x = 30 , y = 75 调用 fooA() 的内嵌函数 fooB(x , y)
  8. print('%d' % fx2(30 , 75))  # 以 a = 150 , b = 15 , x = 30 , y = 75 调用 fooA() 的内嵌函数 fooB(x , y)
复制代码

【装饰器】:
  1. def fooA(fx) :                          # 调用参数 fx 就是被装饰函数 work() 的调用句柄
  2.     def fooB(x , y) :                   # 由于 work() 有 2 个输入参数,所以,这里也得有 2 个输入参数
  3.         a , b = 3 , 5                   # 用于修改计算公式
  4.         print('开始调用被装饰函数')
  5.         k = fx(a * x , b + y)           # 用修改过的参数调用被装饰函数 work()
  6.         print('被装饰函数调用完毕')
  7.         return k + 30                   # 修改对被装饰函数 work() 调用的结果
  8.     return fooB                         # 以内嵌函数 fooB 作为被装饰函数的实际调用句柄

  9. @fooA                                   # 用函数 fooA() 提供的新调用句柄 fooB 替代 work
  10. def work(c , d) :                       # 被装饰函数 work() 带有 2 个输入参数
  11.     print('在被装饰函数内')
  12.     return a * b                        # 被装饰函数有返回值

  13. print('计算结果为 : %d' % work(7 , 9))  # 调用经过装饰的函数 work()
复制代码

    fooA() 装饰 work(),当调用 work() 时,会实际调用由 fooA 提供的内嵌函数 fooB(),并由 fooB() 来负责完成对被装饰函数 work() 的调用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-7 04:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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