python基础-装饰器

66 阅读1分钟
"""
装饰器本质上是一个闭包
作用:
在不改变原有函数调用的情况下,给函数增加新功能。
场景举例:
1.用户需要登录的地方
2.记录日志

一个函数可以被多个装饰器装饰
"""


# ======================= 单装饰器========================
# 装饰器
def wrapper(game):
    # 这里的*和**表示接收所有参数,分别打包成元组和字典
    def inner(*args, **kwargs):
        print("open 挂")
        # 这里的*和**表示把args元组打散成位置参数,把kwargs打散成关键字参数
        ret = game(*args, **kwargs)
        print("close 挂")
        return ret

    return inner  # 返回一个函数


@wrapper  # 相当于play_dnf = wrapper(play_dnf)
def play_dnf(user, pwd):
    print(user, pwd)
    print("this is dnf")


@wrapper  # 相当于play_lol = wrapper(play_lol)
def play_lol(user, pwd, hero):
    print(user, pwd, hero)
    print('this is lol')


# play_dnf = wrapper(play_dnf)
play_dnf('admin', '123')
# play_lol = wrapper(play_lol)
play_lol('admin', '456', '后羿')


# ======================= 多装饰器========================
def wrapper1(game):
    # 这里的*和**表示接收所有参数,分别打包成元组和字典
    def inner(*args, **kwargs):
        print("open1 挂")
        # 这里的*和**表示把args元组打散成位置参数,把kwargs打散成关键字参数
        ret = game(*args, **kwargs)
        print("close1 挂")
        return ret

    return inner  # 返回一个函数


def wrapper2(game):
    # 这里的*和**表示接收所有参数,分别打包成元组和字典
    def inner(*args, **kwargs):
        print("open2 挂")
        # 这里的*和**表示把args元组打散成位置参数,把kwargs打散成关键字参数
        ret = game(*args, **kwargs)
        print("close2 挂")
        return ret

    return inner  # 返回一个函数


@wrapper1
@wrapper2
def play_more():
    print('this is more')


play_more()
"""
执行结果:
open1 挂
open2 挂
this is more
close2 挂
close1 挂

执行顺序和规律:wrapper1 wrapper2 自定义函数 wrapper2 wrapper1
"""