鱼C论坛

 找回密码
 立即注册
查看: 1536|回复: 3

[学习笔记] 函数-装饰器-Ⅵ

[复制链接]
发表于 2023-3-12 16:12:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> import time
>>>
>>> def time_master(func):
...         def call_func():
...                 print("开始运行程序")
...                 start = time.time()
...                 func()
...                 stop = time.time()
...                 print("结束程序...")
...                 print(f"一共耗费了{(stop - start):.2f} 秒。")
...         return call_func
...
>>> @time_master
... def myfunc():
...         time.sleep(2)
...         print("I love fishC")
...
>>> myfunc()
开始运行程序
I love fishC
结束程序...
一共耗费了2.00 秒。
>>> def myfunc():
...         time.sleep(3)
...         print(" I love you")
...
>>> myfunc = time_master(myfunc)
>>> myfunc()
开始运行程序
I love you
结束程序...
一共耗费了3.00 秒。
>>> # 这个就是装饰器的实现原理啦~
>>> 多个装饰器也可以用在同一个函数上:
>>> def add(func):
...         def inner():
...                 x = func()
...                 return x + 1
...         return inner
...
>>>
>>> def cube(func):
...         def inner():
...                 x = func()
...                 return x * x * x
...         return inner
...
>>>
>>> def square(func):
...         def inner():
...                 x = func()
...                 return x * x
...         return inner
...
>>> @add
... @cube
... @square
... def test():
...         return 2
...
>>> print(test())
65
>>> print(test())
65
>>> # 先计算平方(square 装饰器),再计算立方(cube 装饰器),最后再加 1(add 装饰器)。

>>> >>>
>>> # 如何给装饰器传递参数呢?
>>> # 添加多一层嵌套函数来传递参数:
>>>
>>> import time
>>>
>>> def loger(msg):
...         def time_master(func):
...                 def call_func():
...                         start = time.time()
...                         func()
...                         stop = time.time
...                         print(f"[{msg}]一共耗费了{(stop - start):.2f}")
...                 return call_func
...         return time_master
...
>>> def logger(msg):
...         def time_master(func):
...                 def call_func():
...                         start = time.time()
...                         func()
...                         stop = time.time()
...                         print(f"[{msg}]一共耗费了{(stop - start):.2f}")
...                 return call_func
...         return time_master
...
>>>
>>> @logger(msg="A")
... def funA():
...         time.sleep(5)
...         print("正在调用funA...")
...
>>> @logger(msg="B")
... def funB():
...         time.sleep(6)
...         print("正在调用funB...")
...
>>> funA()
正在调用funA...
[A]一共耗费了5.01
>>> funB()
正在调用funB...
[B]一共耗费了6.00
>>> # 这里其实就是给它裹多一层嵌套函数上去,然后通过最外层的这个函数来传递装饰器的参数。
>>> # 这样,logger(msg="A") 得到的是 timemaster() 函数的引用,然后再调用一次,并传入 funA,也就是这个 logger(msg="A")(funA),得到的就是 call_func() 函数的引用,最后将它赋值回 funA()。
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-14 10:10:47 | 显示全部楼层
不明觉厉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-14 16:01:06 | 显示全部楼层
不明觉厉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-31 14:28:06 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-1 23:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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