装饰器
- 装饰器 =高阶函数+函数嵌套+闭包
- 高阶函数:1:函数接收的参数是一个函数名
2:返回值中包含函数
- @ 语法糖
- 装饰器框架:
def timmer(funk):
def warpper():
funk()
return warpper
- 为qqx函数 加上运行时间功能:
# import time
# def weita(funk): #funk == qqx
# def maidong():
# start_time = time.time()
# funk() #运行qqx()函数
# stop_time = time.time()
# print('qqx函数的运行时间是%s'%(stop_time-start_time))
# return maidong
# @weita #qqx = weita(qqx) @语法糖
# def qqx():
# time.sleep(3)
# print('我想吃榴莲')
# qqx()
- 不但增加功能 还要接收haha函数的返回值:
def weita(funk):
def maidong():
res = funk()
print('周末去哪儿玩')
return res
return maidong
@weita #haha = weita(haha)
def haha():
print('我想榴莲')
return '123'
res = haha()
print(res)
- 为一个有参数的函数 增加新功能:
def weita(funk):
def maidong(*args,**kwargs): #加上*args,**kwargs即可
res = funk(*args,**kwargs) #加上*args,**kwargs即可
print('今天天气不错哟')
return res
return maidong
@weita
def qqx(x):
res = [i for i in x]
return res
ab = qqx(range(10))
print(ab)
@weita
def qqx_1():
print('alex')
qqx_1( )
- 为函数加入验证功能:
def maidong(funk): ###为函数加入验证功能 def index(*args,**kwargs): zhanghao = input('请输入你的账户名: ').strip().lower() password = input('请输入密码: ').strip().lower() if zhanghao=='sb' and password=='123': res = funk(*args,**kwargs) return res else:print('验证有误') return index @maidong def weita(name): print('欢迎%s进入京东主页'%name) @maidong def shooping_car(name,tom,linda,alex): print('%s的购物车里有 %s,%s,%s'%(name,tom,linda,alex)) weita('回锅肉') shooping_car('回锅肉','辣条','暖宝宝',"酸辣粉")
- 为函数加入验证功能且不用重复验证:
dic = {'zhanghao':None,'password':False}
def maidong(funk): ###为函数加入验证功能 且不用重复验证
def index(*args,**kwargs):
if dic['zhanghao'] and dic['password']:#判断健对应的值是否为True
res = funk(*args,**kwargs)
return res
zhanghao = input('请输入你的账户名: ').strip().lower()
password = input('请输入密码: ').strip().lower()
if zhanghao=='sb' and password=='123':
dic['zhanghao']='sb' #修改了全局变量
dic['password']='123' #修改了全局变量
res = funk(*args,**kwargs)
return res
else:print('验证有误')
return index
@maidong
def weita(name):
print('欢迎%s进入京东主页'%name)
@maidong
def shooping_car(name,tom,linda,alex):
print('%s的购物车里有 %s,%s,%s'%(name,tom,linda,alex))
weita('回锅肉')
shooping_car('回锅肉','辣条','暖宝宝',"酸辣粉")
- 为函数加入验证功能且不用重复验证且判断用户输入的账户,密码是否正确:
dic_1 = [{'name':'ab','Population':'10'},#用户账号密码序列
{'name':'cd','Population':'20'},#判断用户输入的账户密码是否在这个列表里面
{'name':'ef','Population':'30'},
{'name':'gg','Population':'40'}]
dic = {'zhanghao':None,'password':False}
def maidong(funk): ###为函数加入验证功能 且不用重复验证
def index(*args,**kwargs):
if dic['zhanghao'] and dic['password']:#判断健对应的值是否为True
res = funk(*args,**kwargs)
return res
zhanghao = input('请输入你的账户名: ').strip().lower()
password = input('请输入密码: ').strip().lower()
for i in dic_1:
if i['name'] == zhanghao and i['Population'] == password:
dic['zhanghao']=i['name']
dic['password']=i['Population']
res = funk(*args, **kwargs)
return res
else:print('验证有误')
return index
@maidong
def weita(name):
print('欢迎%s进入京东主页'%name)
@maidong
def shooping_car(name,tom,linda,alex):
print('%s的购物车里有 %s,%s,%s'%(name,tom,linda,alex))
weita('回锅肉')
shooping_car('回锅肉','辣条','暖宝宝',"酸辣粉")
- 装饰器实现带参数:
###实现装饰器带参数 (应用:判断dic_1是在哪个库中 然后进行打开库 提取数据 再进行判断操作) dic_1 = [{'name':'ab','Population':'10'},#用户账号密码序列 {'name':'cd','Population':'20'},#判断用户输入的账户密码是否在这个列表里面 {'name':'ef','Population':'30'}, {'name':'gg','Population':'40'}] dic = {'zhanghao':None,'password':False} def aotuo(x): #接收参 传参的话 要再原有的函数上再嵌套一个函数 并且 这个函数的返回值是原有函数的函数名 print('函数真%s'%x) def maidong(funk): ###为函数加入验证功能 且不用重复验证 def index(*args,**kwargs): if dic['zhanghao'] and dic['password']:#判断健对应的值是否为True res = funk(*args,**kwargs) return res zhanghao = input('请输入你的账户名: ').strip().lower() password = input('请输入密码: ').strip().lower() for i in dic_1: if i['name'] == zhanghao and i['Population'] == password: dic['zhanghao']=i['name'] dic['password']=i['Population'] res = funk(*args, **kwargs) return res else:print('验证有误') return index return maidong #aotuo函数 最后返回maidong @aotuo('狗屎') #这里面传参 这里运行aotuo函数返回maidong--->weita=maidong(weita) def weita(name): print('欢迎%s进入京东主页'%name) @aotuo('不错') def shooping_car(name,tom,linda,alex): print('%s的购物车里有 %s,%s,%s'%(name,tom,linda,alex)) weita('回锅肉') shooping_car('回锅肉','辣条','暖宝宝',"酸辣粉")

浙公网安备 33010602011771号