Python装饰器

python装饰器笔记

例1.简简单单装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import time

def spend_time(function): # 装饰器函数
def inner():
start = time.time()
function()
stop = time.time()
print(f"Spend {stop - start}s")

return inner
# 返回存放着 inner结果的 地址
# 因为是地址 所以,需要实例化之后才能得到结果 ————实现了不修改原函数 就能添加功能 ————装饰器函数


@spend_time # 相当于 bar = spend_time(bar()) 用 @[函数名] 来省略左边那一行代码 简洁
def bar():
print("bar.....")
time.sleep(1.2)

运行结果
bar.....
Spend 1.215440273284912s

例2.稍微复杂装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import time

def spend_time(function): # 装饰器函数
def inner(*x, **y): # 因为是直接执行 内嵌函数 所以内嵌函数也需要 *x,**y 来接受元素
start = time.time()
👉 function(*x, **y) # 真正执行addFunction的地方
stop = time.time()
print(f"Spend {stop - start}s")

return inner

@spend_time # 相当于 addFunction = spend_time(addFunction(*a, **b))
def addFunction(*a, **b):
sums = 0
for number in a:
sums += number
print(sums)
time.sleep(0.2)

addFunction(1,2,3,4,5) # 相当于 addFunction = spend_time(addFunction(1,2,3,4,5))
# addFunction被当作实参传到spend_time的function中
# (1,2,3,4,5)被当作是spend_time的内嵌函数inner的实参
# 所以实际上函数是在inner内执行
# 表面上function(*x, **y) 实际上是 addFunction(*a, **b)
# 也就是说一旦function不接受这些实参的话,比如👉 function()
# 那么虽然执行了addFunction(1,2,3,4,5)但真正执行的是addFunction()
运行结果
15
Spend 0.20099997520446777s

function( )的情况

1
2
3
4
5
addFunction(1,2,3,4,5)

运行结果
0
Spend 0.20083141326904297s

function(5)的情况

1
2
3
4
5
addFunction(1,2,3,4,5)

运行结果
5
Spend 0.20568037033081055s