day14装饰器
1.什么是装饰器
器即函数
装饰即修饰,意指为其他函数添加新功能
装饰器定义:本质就是函数,功能是为其他函数添加新功能
2.装饰器需要遵循的原则
不修改被装饰函数的源代码(开放封闭原则)
为被装饰函数添加新功能后,不修改被修饰函数的调用方式
3.装饰器=高阶函数+函数嵌套+闭包
4.高阶函数定义:
函数接收的参数是一个函数名
函数的返回值是一个函数名
满足上述条件任意一个,都可称之为高阶函数
def foo(): print('我的函数名作为参数传给高阶函数') def gao_je1(func): #函数名所在的内存地址 print('我就是高阶函数1,我接收的函数名是%s'%func) func()#执行传入的函数 def gao_jie2(func): #函数名所在的内存地址 print('我就是高阶函数2,我的返回值是%s'%func) return func()#返回执行高阶函数 gao_je1(foo)#将函数名传给gao_je1 gao_jie2(foo)#将函数名传给gao_jie2
5.我们确实没有改变foo的调用方式,但是我们也没有为foo
增减新的功能
import time def foo(): print('from the foo') def timmer(func): start_time = time.time() return func stop_time = time.time() print('函数%s,运行时间是%s'%(func,start_time- start_time)) timmer(foo) foo() 1.函数接收的参数是一个函数名 作用:在不修改函数源代码的前提下,为函数添加新功能, 不足:会改变函数的调用方式 2.函数的返回值是一个函数名 作用:不修改函数的调用方式 不足:不能添加新功能
6.函数的嵌套
def father(name): print('from father %s'%name) def son: print('from son') def grandson(): print('from grandson') grandson() son() father('林海峰')
7.闭包:在一个作用域里定义变量,相当于打了个包
def father(name): def son: print('我爸爸是【%s】'%name) def grandson(): print('我爷爷是【%s】'%name) grandson() son() father('raetyu')
8.装饰器的基本架子
def timer(func): def wrapper(): return wrapper
9.加上参数
def timer(func): def wrapper(*args,**kwargs): func(*args,**kwargs) return wrapper
10.加上功能
import time def timer(func): def wrapper(*args,**kwargs): start_time=time.time() func(*args,**kwargs) stop_time=time.time() print('函数[%s],运行时间是[%s]' %(func,stop_time-start_time)) return wrapper
11.加上返回值
import time def timer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print('函数【%s】,运行时间 【%s】'%(func,start_time-stop_time)) return res return wrapper def cal(array): res=0 for i in array: res+=i return res cal=timer(cal) cal(range(10)) @timer#@timer就等同于cal=timer(cal) def cal(array): res=0 for i in array: res+=i return res cal=(range(10))
12.无带参修饰
user_list=[ {'name':'alex','passwd':'123'}, {'name':'linhaifeng','passwd':'123'}, {'name':'wupeiqi','passwd':'123'}, {'name':'yuanhao','passwd':'123'}, ] current_user={'username':None,'login':False} #认证功能 def auth_deco(func): def wrapper(*args,**kwargs): if current_user['username'] and current_user ['login']: res=func(*args,**kwargs) return res#返回被修饰函数,不然在内存中会 消失 username=input('用户名:').strip()#删除头尾指 定的空字符 passwd=input('密码:').strip() for index,user_dic in enumerate(user_list): if username == user_dic['name'] and passwd == user_dic['passwd']: current_user['username']=username current_user['login']=True res=func(*args,**kwargs) return res else: print('用户名和密码错误,重新登录') return wrapper @auth_deco def index(): print('欢迎来到主页面') @auth_deco def home(): print('这里是你家') def shopping_car(): print('查看购物车啊亲') def order(): print('查看订单啊亲') print(user_list) index() print(user_list)
13.带参修饰
user_list=[ {'name':'alex','passwd':'123'}, {'name':'linhaifeng','passwd':'123'}, {'name':'wupeiqi','passwd':'123'}, {'name':'yuanhao','passwd':'123'}, ] current_user={'username':None,'login':False} def auth(auth_type='file'):#函数套在最后一层,只能套用这个函数 def auth_deco(func): def wrapper(*args,**kwargs): if auth_type == 'file': if current_user['username'] and current_user['login']: res=func(*args,**kwargs) return res username=input('用户名: ').strip() passwd=input('密码: ').strip() for index,user_dic in enumerate(user_list): if username == user_dic['name'] and passwd == user_dic['passwd']: current_user['username']=username current_user['login']=True res=func(*args,**kwargs) return res break else: print('用户名或者密码错误,重新登录') elif auth_type == 'ldap': print('巴拉巴拉小魔仙') res=func(*args,**kwargs) return res return wrapper return auth_deco #auth(auth_type='file')就是在运行一个函数,然后返回auth_deco,所以@auth(auth_type='file') #就相当于@auth_deco,只不过现在,我们的auth_deco作为一个闭包的应用,外层的包auth给它留了一个auth_type='file'参数 @auth(auth_type='ldap')认证类型的选择功能 def index(): print('欢迎来到主页面') @auth(auth_type='ldap') def home(): print('这里是你家') def shopping_car(): print('查看购物车啊亲') def order(): print('查看订单啊亲') # print(user_list) index() # print(user_list) home()

浙公网安备 33010602011771号