Python装饰器实例

"""
通用装饰器的写法:
def wrapper(fn): # wrapper: 装饰器, fn: 目标函数
    def inner(*args, **kwargs):
        # 在目标函数执行之前……
        ret = fn(*args, **kwargs) # 执行目标函数
        # 在目标函数执行之后……
        return ret
    return inner

@wrapper
def target():
    pass

target() # => inner()

一个函数可以被多个装饰器装饰
@wrapper1
@wrapper2
def target():
    print('我是目标函数')
结果 wrapper1 wrapper2 TARGET wrapper2 wrapper1

"""

# 例子1
def guanjia(game):
    # *,** 表示接收所有参数,打包成元组和字典
    def inner(*args, **kwargs): # inner添加了参数,args元组,kwargs字典
        print("打开外挂")
        # *,** 表示把args元组和kwargs字典打散成位置参数以及关键字参数传递进去
        game(*args, **kwargs) 
        print("关闭外挂")
    return inner

@guanjia
def play_dnf(username, password):
    print("开始玩dnf", username, password)

@guanjia
def play_lol(username, password, hero):
    print("开始玩lol", username, password, hero)

play_dnf("admin", "123456")
play_lol("admin", "123456", "xxx")

# 多个wrapper例子
def wrapper1(fn): # fn: wrapper2.inner
    def inner(*args, **kwargs):
        print("这是wrapper1 进入")
        ret = fn(*args, **kwargs) # wrapper2.inner
        print("这是wrapper1 出去")
        return ret
    return inner

def wrapper2(fn): # fn: target
    def inner(*args, **kwargs):
        print("这是wrapper2 进入")
        ret = fn(*args, **kwargs) # target
        print("这是wrapper2 出去")
        return ret
    return inner

@wrapper1 # target = wrapper1(wrapper2.inner) => target: wrapper1.inner
@wrapper2 # target = wrapper2(target) => target: wrapper2.inner
def target():
    print("我是目标")

target() # 结果 wrapper1 wrapper2 TARGET wrapper2 wrapper1

# 登录后增删改查例子
login_flag = False
def login_verify(fn):
    def inner(*args, **kwargs):
        global login_flag
        if login_flag == False:
            # 这里做登陆校验
            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_verify
def add():
    print("增加信息")

@login_verify
def del():
    print("删除信息")

@login_verify
def update():
    print("修改信息")

@login_verify
def search():
    print("查询信息")

add()

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值