装饰器

  • 装饰器 =高阶函数+函数嵌套+闭包
  • 高阶函数: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('回锅肉','辣条','暖宝宝',"酸辣粉")
View Code
  • 为函数加入验证功能且不用重复验证:
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('回锅肉','辣条','暖宝宝',"酸辣粉")
View Code
  • 为函数加入验证功能且不用重复验证且判断用户输入的账户,密码是否正确:
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('回锅肉','辣条','暖宝宝',"酸辣粉")
View Code
  • 装饰器实现带参数:
###实现装饰器带参数  (应用:判断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('回锅肉','辣条','暖宝宝',"酸辣粉")

 

posted @ 2021-01-14 11:09  奖励大鸡腿  阅读(92)  评论(0)    收藏  举报