python装饰器

回顾:

1函数可以作为参数进行传递:

 上述等价于直接调用:func()

2.函数可以作为返回值返回

 func()的返回值是函数ret

ret是内层函数  

3.函数名称可以当成变量一样进行赋值操作。

装饰器 

记住最后的结论:

装饰器本质上是一个闭包

        作用:在不改变原有函数调用的情况下,给函数增加新的功能。

        给函数添加新功能,但不改变原先的代码。        用处:用户登录,日志。                       

通用装饰器
def wrapper(fn):  #wrapper 装饰器,fn:目标函数
    def inner(*args,**args):
        # 在目标函数执行之前
        ret = fn(*args,**args)    #执行目标函数
        return ret  #返回值  
    return  inner    #千万不要加()


@wrapper
def target():
    psaa

target()  # =>inner()

#基本的原理
#进行封装
def game_help(game):
    def inner():
        print("开始游戏")
        game()
        print("关闭游戏")
    return inner

def play_csgo():
    print("RUSH B")
def play_lol():
    print("且随疾风前行")

#重新封装的游戏
play_csgo = game_help(play_csgo)
play_lol = game_help(play_lol)

play_lol()


//terminal
开始游戏
且随疾风前行
关闭游戏

但是真正使用的时候,没必要写那么复杂,在每个前面添加一个@装饰器名

def game_help(game):
    def inner():
        print("开始游戏")
        game()
        print("关闭游戏")
    return inner

@game_help
def play_csgo():
    print("RUSH B")

@game_help
def play_lol():
    print("且随疾风前行")

play_lol()

//terminal
开始游戏
且随疾风前行
关闭游戏

参数

增加位置参数关键字参数,便于传递参数

def game_help(game):
    def inner(*args,**kwargs):
        print("开始游戏")
        game(*args,**kwargs)
        print("关闭游戏")
    return inner

@game_help
def play_csgo():
    print("RUSH B")

@game_help
def play_lol(admin,username):
    print("且随疾风前行",admin,username)  #传递参数

play_lol("亚索","追风")

 实战:添加员工信息

login_flag = False   #全局变量

def login_verify(fn):
    def inner(*args,**kwargs):
        global login_flag  #引入全局变量
        if login_flag == False:   #保存登录状态,添加时不必重新登录
            print("请登录")
            #完成登录校验
            while 1:
                username = input(">>>username :")
                password  = input(">>>paaaword : ")
                if username ==  "admin" and password == "123":
                    print("登录成功")
                    login_flag = True
                    break
                else:
                    print("登录失败,密码或用户名错误")

        ret = fn(*args,**kwargs)  #后续的程序
        return ret
    return inner

@login_verify
def add():
    print("添加员工信息")
@login_verify
def delete():
    print("删除员工信息")
def upd():
    print("修改员工信息")
def search():
    print("查询员工信息")

add()
delete()


terminal//
请登录
>>>username :admin
>>>paaaword : 123
登录成功
添加员工信息
删除员工信息

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值