一、装饰器的基本原理
装饰器:本质就是函数,功能是为其他函数添加附加功能。
原则:不修改被修饰函数的源代码
不修改修饰函数的调用方法论
装饰器=高阶函数+函数嵌套+闭包
二、高阶函数(满足不了装饰器的功能)
1、函数接收的参数是一个函数名
2、函数的返回值是一个函数名
3、满足上述条件任意某一个,都可以称之为高阶函数
# 1) 不能保证函数的调用方式不被修改
def foo():
print('我爱可乐')
def test(func):
#print(func)
func()
test( foo)
# 2)
def foo():
print('我爱可乐')
def test(func):
return func
res = test(foo)
res() #我爱可乐
# 3)为foo增加新功能且不被改变点调用方式
import time
def foo():
time.seep(3)
print('我爱可乐')
def test(func):
star.time = time.time()
func()
stop_tipme = time.time()
print('函数的运行时间是%s'%(stop_time-star_time))
return func
foo = test(foo)
foo() #我爱可乐
#函数的运行时间是 3.0001716613769
#我爱可乐
三、函数的嵌套
def foo(name):
print('我最爱%s'%name)
def test():
print('她也喜欢%s'%name)
test()
foo('可乐') #我最爱可乐
#她也喜欢可乐
四、常函数闭包
def foo(name):
def test():
def test1():
print('我也喜欢%s'%name)
test1() #直接通过foo调用test1
test()
foo('可乐') #我也喜欢可乐
5、装饰器
1)、框架
def timmer(func):
def wrapper():
print(func)
func()
return wrapper
2)、运用装饰器给函数增加功能
import time
def timmer(func):
def wrapper():
star.time = time.time()
res=func() #此时便可返回test中的返回值了
stop_tipme = time.time()
print('函数的运行时间是%s'%(stop_time-star_time))
return res #函数闭包上加返回值
return wrapper
@timmer #相当于test = timmer(test)
def test():
time.sleep(3)
print('函数运行完毕')
test() #函数运行完毕
#函数的运行时间是 3.0001714229
七、函数闭包上加参数
补:解压序列:(1)a,b,c = (1,2,3) 以一对应a获取1,b获取2,c获取3
(2)l = [10,‘b’,12,11]
a,*,c = l # *代表中间所有元素,后面可以加任何变量
print(a) #10
print() #[‘b’,12]
print© #11
若两数交换可用简单方法:
a=1,b=2
a,b=b,a
print(a) #2
print(b) #1
import time
def timmer(func):
def wrapper(*args,*kwargs):
star.time = time.time()
res=func(*args,*kwargs) #此时便可返回test中的返回值了
stop_tipme = time.time()
print('函数的运行时间是%s'%(stop_time-star_time))
return res #函数闭包上加返回值
return wrapper
@timmer #相当于test = timmer(test)
def test(name,age):
time.sleep(3)
print('函数运行完毕')
retuen '这是test的返回值'
@timmer #相当于test = timmer(test)
def test1(name,age,alex):
time.sleep(3)
print('.....')
return '3'
八、函数闭包为函数加上认证功能
def test_func(func):
def wrapper(*args,*kwargs):
username = input('输入用户名:').strip()
passward = input('输入密码:').strip()
if username == '可乐' and passward == '123':
res=func(*args,*kwargs)
return res
else:
print('用户名或密码错误')
return wrapper
@test_func
def index():
print('欢迎来到淘宝界面')
@test_func
def shopping(name):
print('欢迎%s回家'%name)
index() #用户名:可乐
#密码:123
#欢迎来到淘宝界面
shopping('主人') #用户名:可乐
#密码:123
#欢迎主人回家
九、函数闭包参数模拟
user_dic = {'username':None,'login':False} #用来判断用户的登录状态
list = [
{'name':'alxe','passward''123':}
{'name':'kele','passward''234':}
{'name':'ooo','passward''345':}
]
def timmer(func):
def wrapper(*args,*kwargs):
if user_dic['username'] and user['login']:
res=func(*args,*kwargs)
return res
username = input('输入用户名:').strip()
passward = input('输入密码:').strip()
for user_list in dic
if username == user_list['name'] and passward == user_list['passwaed']:
user_dic['username'] == username
user_dic['login'] == True
res=func(*args,*kwargs)
return res
else:
print('用户名或密码错误')
return wrapper
@timmer
def index():
print('欢迎来到淘宝界面')
@timmer
def home(name):
print('欢迎%s回家'%name)
index()
home('可乐')
十、带参数的装饰器
current_dic = {'username':None,'login':False} #用来判断用户的登录状态
list = [
{'name':'alxe','passward''123':}
{'name':'kele','passward''234':}
{'name':'ooo','passward''345':}
]
def auth(auth_type = 'filedb')
def auth_func(func):
def wrapper(*args,*kwargs):
print('认证类型是',auth_type)
if auth_type=='filedb':
if current_dic['username'] and current_dic['login']:
res=func(*args,*kwargs)
return res
username = input('输入用户名:').strip()
passward = input('输入密码:').strip()
for user_list in list
if username == user_list['name'] and passward == user_list['passwaed']:
current_dic['username'] == username
current_dic['login'] == True
res=func(*args,*kwargs)
return res
else:
print('用户名或密码错误')
elif autn_type=='ldap'
print('认证完毕')
return wrapper
return auth_func
@auth(auth_type = 'filedb')
def index():
print('欢迎来到淘宝界面')
@auth(auth_type = 'filedb')
def home(name):
print('欢迎%s回家'%name)
index()
home('可乐')