装饰器可以实现在不修改原来代码的前提下增加新功能。
(通过将原来代码作为函数,传入装饰器,返回新的结果)
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("Hello Python.")
myfunc()
>>>
开始运行程序...
Hello Python.
结束程序运行...
一共耗费了 2.13 秒.
此外,多个装饰器可以用在同一个函数上,还可以通过函数的多层嵌套调用给装饰器传递参数。
(多个@装饰器时,执行顺序是从下往上)
def square(func):
def inner():
x = func()
return x ** 2
return inner
def add(func):
def inner():
x = func()
return x + 3
return inner
@square
@add
def test():
return 2
print(test()) # 顺序为(2+3)** 2
>>>
25
装饰器也可以传入参数。
import time
def logger(msg):
def time_master(func):
def inner():
start = time.time()
func()
stop = time.time()
print(f"[{msg}]一共耗费了 {(stop-start):.2f} 秒.")
return inner
return time_master
@logger(msg='A') # 等同于funA = logger(msg=‘A’)(funA)
def funA():
print("正在运行程序funA...")
time.sleep(1)
@logger(msg='B')
def funB():
print("正在运行程序funB...")
time.sleep(2)
funA()
funB()
>>>
正在运行程序funA...
[A]一共耗费了 1.08 秒.
正在运行程序funB...
[B]一共耗费了 2.03 秒.
|