p y t h o n 装 饰 器 讲 解 python装饰器讲解 python装饰器讲解
https://www.bilibili.com/video/BV1d7411h794?from=search&seid=1533734394001955603
装饰器:在原函数不改变的情况下,添加新的功能
一 基础知识补充:
1.格林威治时间:
3.函数闭包:
在一个外函数中定义了一个内函数,内函数可以运用外函数
的临时变量(temp=666)
,并且外函数的返回值是内函数的引用(即def inner()函数)
def outer(in):
temp = 666
def inner():
print(in+temp)
return inner
demo = outer(222)
demo()
二 以计算函数运行时间的装饰器为例子
第一版
import time
def index():
time.sleep(2)
start_time = time.time()
index()
end_time = time.time()
print(end_time - start_time)
第二版
import time
def index():
time.sleep(2)
def calculate_time():
start_time = time.time()
index()
end_time = time.time()
print(end_time - start_time)
calculate_time()
第三版:
import time
def index():
time.sleep(2)
def calculate_time(f):
start_time = time.time()
f()
end_time = time.time()
print(end_time - start_time)
calculate_time(index)
第四版:
import time
def index():
time.sleep(2)
def calculate_time(f):
def inner():
start_time = time.time()
f()
end_time = time.time()
print(end_time - start_time)
return inner
index = calculate_time(index) # 这其实就是装饰器了,转换成语法糖就是熟知的装饰器 == @calculate_time
index()
第五版:
import time
def calculate_time(f):
def inner():
start_time = time.time()
f()
end_time = time.time()
print(end_time - start_time)
return inner
@calculate_time
def index():
time.sleep(2)
index()
# index = calculate_time(index) # 这其实就是装饰器了,转换成语法糖就是熟知的装饰器 == @calculate_time
# index()
第六版:
import time
def calculate_time(f):
def inner():
start_time = time.time()
ret = f()
end_time = time.time()
print(end_time - start_time)
return ret
return inner
@calculate_time
def index():
time.sleep(2)
return "index"
print(index())
第七版:
真正的装饰器(加上传递参数)
import time
def calculate_time(f):
def inner(*args,**kwargs):
start_time = time.time()
ret = f(*args,**kwargs)
end_time = time.time()
print(end_time - start_time)
return ret
return inner
@calculate_time
def add(x,y):
time.sleep(2)
return x+y
print(add(3,3))
助你理解
回顾第四版:
import time
def index():
time.sleep(2)
def calculate_time(f):
def inner():
start_time = time.time()
f()
end_time = time.time()
print(end_time - start_time)
return inner
index = calculate_time(index) # 这其实就是装饰器了,转换成语法糖就是熟知的装饰器 == @calculate_time
index()
可知第七版就是:
@calculate_time
def add(x,y):
time.sleep(2)
return x+y
等同于
calculate_time(add(x,y))