BrightXiong 发表于 2023-3-12 16:12:11

函数-装饰器-Ⅵ

>>> 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...
一共耗费了5.01
>>> funB()
正在调用funB...
一共耗费了6.00
>>> # 这里其实就是给它裹多一层嵌套函数上去,然后通过最外层的这个函数来传递装饰器的参数。
>>> # 这样,logger(msg="A") 得到的是 timemaster() 函数的引用,然后再调用一次,并传入 funA,也就是这个 logger(msg="A")(funA),得到的就是 call_func() 函数的引用,最后将它赋值回 funA()。
>>>

奔跑的郭蛋蛋 发表于 2023-3-14 10:10:47

不明觉厉

whge 发表于 2023-3-14 16:01:06

不明觉厉
{:5_109:}

match123_xbd 发表于 2023-3-31 14:28:06

{:5_106:}
页: [1]
查看完整版本: 函数-装饰器-Ⅵ