python装饰器
一、装饰器的简易版本
# 给函数index函数添加运行计时的功能
import time
def index():
print('你好呀,大宝贝!')
def outer(func):
def get_time():
start_time = time.time()
func()
end_time = time.time()
print('程序运行的时间为%s' % (end_time - start_time))
return get_time
index = outer(index)
index()

二、解决参数问题
# 给函数index,inner添加运行计时的功能
import time
def index():
print('你好呀,大宝贝!')
def inner(n):
print('你好呀,小甜心!')
def outer(func):
def get_time(*args, **kwargs):
start_time = time.time()
func()
end_time = time.time()
print('函数运行的时间为%s' % (end_time - start_time)
return get_time
index = outer(index)
index()
inner = outer(inner)
inner(2)
三、解决返回值问题

请为函数index和函数inner添加计时功能以及输出他们的返回值
import time
def index():
print('你好呀,大宝贝!')
return '真会说话!'
def inner(n):
print('你好呀,小甜心!')
return '我说的都是心里话'
def outer(func):
def get_time(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs)
end_time = time.time()
print('函数运行的时间是%s' % (end_time - start_time))
return res
return get_time
index = outer(index)
res = index()
print(res)
四、装饰器的模板

def outer(func):
def inner(*args, **kwargs):
print('执行被装饰函数之前可以添加的功能')
res = func(*args, **kwargs)
print('执行被装饰函数之后可以添加的功能')
return res
return inner
index = outer(index)
index()
五、装饰器的语法糖
装饰器语法糖的写作规范
'语法糖必须紧贴在被装饰函数的上方'
# 模板
def outer(func):
def inner(*args, **kwargs):
print('被装饰函数运行之前添加的功能')
res = func(*args, **kwargs)
print('被装饰函数运行之后添加的功能')
return res
return inner
@outer #这句话就相当于 index = outer(index)
def index(*args, **kwargs)
print('你真厉害!')
装饰器语法糖的内部机理
'语法糖可以将被装饰的函数的函数名传给装饰器当参数使用'

六、装饰器的三层语法糖
# 判断七句print执行的顺序
def outter1(func1):
print('加载了outter1')
def wrapper1(*args, **kwargs):
print('执行了wapper1')
res1 = func1(*args, **kwargs)
return res1
return wrapper1
def outter2(func2):
print('加载了outter2')
def wrapper2(*args, **kwargs):
print('执行了wrapper2')
res2 = func2(*args, **kwargs)
return res2
return wrapper2
def outter3(func3):
print('加载了outter3')
def wrapper3(*args, **kwargs):
print('执行了wrapper3')
res3 = func3(*args, **kwargs)
return res3
return wrapper3
@outter1
@outter2
@outter3
def index():
print('from index')
index()rint('from index')
index()
七、装饰器的修复技术
修复技术的目的就是为了让被装饰的函数更加不容易被发现。方法就是在开头直接加上
from functools import wraps, 再在装饰器函数名下面一行添加@wraps(func)
from functools import wraps
def outer(func):
@wraps(funcs)
八、有参装饰器
def(source_data):
def outer(func):
def login_auth(*args, **kwargs):
#核验用户的信息,信息的校验方式可以切换多种
if source_data == 'MysQL':
print('数据从MySQL中取')
elif source_data == 'file':
print('数据从file中取')
else:
print('用户数据不存在,无法执行函数')
return login_auth
return outer
@outer(MySQL)
index()

浙公网安备 33010602011771号