python3学习之路 -- 4.8)装饰器

"""
回顾函数:
    1. 函数可以作为参数进行传递
    2. 函数可以作为返回值进行返回
    3. 函数名称可以当作变量进行赋值操作
装饰器:
    1. 本质是一个闭包
    2. 作用:
        在不改变原有函数调用的情况下,给函数增加新的功能
        即:可以在函数前后添加新功能,但不改变原来的代码
    3. 通用装饰器写法:
        def wrapper(fn): wrapper:装饰器,fn:目标函数
            def inner(*args, **kwargs):
                #在目标函数执行之前。。。
                fn(*args, **kwargs)  #执行目标函数
                #在目标函数执行之后。。。
                return ret
            return inner #此处不可以加()
        @wrapper
        def target():
            pass
        target() # => inner()

    4. 一个函数可以被多个装饰器装饰
        @wrapper1 #target = wrapper(wrapper2.inner) => target:wrapper1.inner
        @wrapper2 #target = wrapper2(target) => target:wrapper2.inner
        def target():
            print("我是目标函数")
        target()
    规则:wrapper1 warpper1 target wrapper2 wrapper1
    5. 实战
"""

'''
#eg1 函数可以作为参数进行传递
def func():
    print('我是函数')
def func2(fn): #fn要求是个函数
    fn()  # func()
func2(func)
#打印:我是函数

#eg2 函数可以作为返回值进行返回
def func():
    def inner():
        print("123")
    return inner
ret = func()
ret()
#打印:123

#eg3 函数名称可以当作变量进行赋值操作
def func1():
    print('我是函数1')
def func2():
    print('我是函数2')
func1 = func2
func1()
#打印:我是函数2
'''
"""
#-----------------------------eg4  装饰器-----------------------------
def guanjia(game):
    def inner():
        print("打开外挂")
        game()
        print("关闭外挂")
    return inner
@guanjia  #相当于 play_dnf = guanjia(play_dnf)
def play_dnf():
    print("你好,在玩dnf!")
@guanjia
def play_lol():
    print("你好,在玩lol!")
play_dnf()  #此时运行的是guanjia给的内层函数inner
'''
打印:
打开外挂
你好,在玩dnf!
关闭外挂
'''
play_lol()
'''
打印:
打开外挂
你好,在玩lol!
关闭外挂
'''
"""
"""
#-----------------------------eg5  装饰器 -- 传参数-----------------------------
def guanjia(game):
    # 这里的* 表示接受所有参数,打包为元组和字典
    def inner(*args, **kwargs):
        print("打开外挂")
        # *, ** 表示把args元组和kwargs字典打散成位置参数以及关键字参数传递进去
        game(*args, **kwargs)
        print("关闭外挂")
    return inner
@guanjia  #相当于 play_dnf = guanjia(play_dnf)
def play_dnf(uasername, password):
    print("你好,在玩dnf!")
@guanjia
def play_lol(uasername, password, hero):
    print("你好,在玩lol!")
play_dnf("admin", "123456")
play_lol("admin", "123456", "鲁班")
"""
"""
#-----------------------------eg6  装饰器 -- 返回值-----------------------------
def guanjia(game):
    def inner(*args, **kwargs):
        print("打开外挂")
        ret = game(*args, **kwargs)  #目标函数的执行,可以拿到目标函数的返回值
        print("关闭外挂")
        return ret
    return inner
@guanjia
def play_dnf(uasername, password):
    print("你好,在玩dnf!")
    return "一把屠龙刀"
def play_lol(uasername, password, hero):
    print("你好,在玩lol!")
ret = play_dnf("admin", "123456")
print(ret)
"""
"""
#-----------------------------eg7  装饰器 -- 一个函数被多个装饰器装饰-----------------------------
def wrapper1(fn): #fn wrapper2.inner
    def inner(*args, **kwargs):
        print("这里是wrapper1 进入")
        ret = fn(*args, **kwargs)
        print("这里是wrapper1 出去")
        return ret
    return inner
def wrapper2(fn): #fn:target
    def inner(*args, **kwargs):
        print("这里是wrapper2 进入")
        ret = fn(*args, **kwargs)
        print("这里是wrapper2 出去")
        return ret
    return inner
@wrapper1 #target = wrapper(wrapper2.inner) => target:wrapper1.inner
@wrapper2 #target = wrapper2(target) => target:wrapper2.inner
def target():
    print("我是目标函数")
target()
'''
打印:
这里是wrapper1 进入
这里是wrapper2 进入
我是目标函数
这里是wrapper2 出去
这里是wrapper1 出去
'''
"""
#-----------------------------eg8  装饰器 -- 实战-----------------------------
login_flag = False
def login_verffy(fn):
    def inner(*args, **kwargs):
        global login_flag
        if login_flag == False:
            #这里完成登陆校验
            print("还未完成用户登陆操作!")
            while 1:
                username = input(">>>")
                password = input(">>>")
                if username == "admin" and password == "123":
                    print("登陆成功")
                    login_flag = True
                    break
                else:
                    print("登陆失败,用户或密码错误")
        ret = fn(*args, **kwargs)
        return ret
    return inner
@login_verffy
def add():
    print("添加信息")

@login_verffy
def delete():
    print("删除信息")
add()
delete()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值