装饰器
装饰器本质就是函数, 为其他函数添加附加功能
# 原则:
# 1.不修改被修饰函数的源代码
# 2.不修改被修饰函数的调用方式
'''
高阶函数定义:
1.函数接收的参数是一个函数名
2.函数的返回值是一个函数名
3.满足上述条件任意一个,都可称之为高阶函数
'''
def foo(): print('from the foo') def test(func): return func res=test(foo) # print(res) res()
函数的闭包 闭包包含函数嵌套
def father(auth_type): # print('from father %s' %name) def son(): # name='xxxxx' # print('我的爸爸是%s' %name) def grandson(): print('我的爷爷是%s' %auth_type) grandson() #print(locals()) son() father('filedb')
装饰器 = 高阶函数 + 函数嵌套 + 闭包
装饰器
1.基本装饰器
import time def timmer(func): def wrapper(): start_time = time.time() func() stop_time = time.time() print('运行时间是%s'%(stop_time - start_time)) return wrapper # def test(): # time.sleep(1) # print('test函数执行完毕') # # test = timmer(test) #返回的是wrapper的地址 # test() #执行的是wrapper() @timmer #test = timmer(test) def test(): time.sleep(1) print('test函数执行完毕') test() #结果:test函数执行完毕 # 运行时间是1.0080018043518066 # @timmer 就相当于 test=timmer(test)
2.加上返回值
import time def timmer(func): def wrapper(): start_time = time.time() ret = func() stop_time = time.time() print('运行时间是%s'%(stop_time - start_time)) return ret return wrapper @timmer #test = timmer(test) def test(): time.sleep(1) print('test函数执行完毕') return '1111111111' rr = test() print(rr) #结果 ''' test函数执行完毕 运行时间是1.009007215499878 1111111111 '''
3.加上参数
import time def timmer(func): def wrapper(name,age): start_time = time.time() ret = func(name,age) stop_time = time.time() print('运行时间是%s'%(stop_time - start_time)) return ret return wrapper @timmer #test = timmer(test) def test(name,age): time.sleep(1) print('名字是:%s 年纪是:%s'%(name,age)) return '1111111111' rr = test('yang',18) print(rr) #结果 ''' 名字是:yang 年纪是:18 运行时间是1.0000061988830566 1111111111 '''
4.加多个参数 *args **kwargs
import time def timmer(func): def wrapper(*args,**kwargs): start_time = time.time() ret = func(*args,**kwargs) stop_time = time.time() print('运行时间是%s'%(stop_time - start_time)) return ret return wrapper @timmer #test = timmer(test) def test(name,age,gender): time.sleep(1) print('名字是:%s 年纪是:%s 性别:%s'%(name,age,gender)) #print(args) return '1111111111' rr = test('yang',18,gender='nan') print(rr) # 结果 ''' 名字是:yang 年纪是:18 性别:nan 运行时间是1.0010037422180176 1111111111 '''
5.验证功能装饰器
user_list=[ {'name':'alex','passwd':'123'}, {'name':'linhaifeng','passwd':'123'}, {'name':'wupeiqi','passwd':'123'}, {'name':'yuanhao','passwd':'123'}, ] current_dic={'username':None,'login':False} def auth_func(func): def wrapper(*args,**kwargs): if current_dic['username'] and current_dic['login']: ret = func(*args,**kwargs) return ret username = input('用户名:').strip() passwd = input('密码:').strip() for line in user_list: if username == line['name'] and passwd == line['passwd']: current_dic['username'] = username current_dic['login'] = True res = func(*args, **kwargs) return res else: print('账号或密码不对') return wrapper @auth_func def index(): print('欢迎来到京东主页') @auth_func def home(name): print('欢迎回家%s' %name) @auth_func def shopping_car(name): print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃')) index() home('产品经理') shopping_car('产品经理')
6.带参数验证功能装饰器
user_list=[ {'name':'alex','passwd':'123'}, {'name':'linhaifeng','passwd':'123'}, {'name':'wupeiqi','passwd':'123'}, {'name':'yuanhao','passwd':'123'}, ] current_dic={'username':None,'login':False} 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']: ret = func(*args,**kwargs) return ret username = input('用户名:').strip() passwd = input('密码:').strip() for line in user_list: if username == line['name'] and passwd == line['passwd']: current_dic['username'] = username current_dic['login'] = True res = func(*args, **kwargs) return res else: print('账号或密码不对') elif auth_type == 'ldap': print('鬼才特么会玩') res = func(*args, **kwargs) return res else: print('鬼才知道你用的什么认证方式') res = func(*args, **kwargs) return res return wrapper return auth_func @auth(auth_type='filedb') def index(): print('欢迎来到京东主页') @auth(auth_type='ldap') def home(name): print('欢迎回家%s' %name) @auth(auth_type='sssssss') def shopping_car(name): print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃')) index() home('产品经理') shopping_car('产品经理')