装饰器的返回值3

装饰器的雏形(有返回值,最终版):

def wapper(fn):  # wapper:装饰,fn:目标函数
    def inner():
        # 在目标函数执行前做一些操作
        ret = fn()  # 执行目标函数
        # 在目标函数后执行一些操作

        return ret
    return inner  # 千万别加(),加了相当于执行这个函数,我们只是做了一个返回
 

然后使用装饰器

@wapper

def tartet():

pass

---------------------------------------------------------------------

def guanjia(game):
    def inner(*args,**kwargs):
        print('打开外挂')
        ret = game(*args,**kwargs)
        print('关闭外挂')
        return ret
    return inner

@guanjia    # play_dnf =  guanjia(play_dnf)
def play_dnf (username,password):
    print('我要开始玩dnf了',username,password)
    print('正在玩DNF中。。。')
    return '+++获得经验+++'


ret = play_dnf('admin','12345')
print(ret)  # 这里打印装饰器里return的值ret,打印:+++获得经验+++,(return的东西如果肉眼可见要用print)


输出>>
打开外挂
我要开始玩dnf了 admin 12345
正在玩DNF中。。。
关闭外挂
+++获得经验+++

---------------------------------------------------------------------------------------------------------------

一个函数被多个装饰器装饰

@wapper1

@wapper2

def target()

        print ('目标函数')

规则和规律 wapper1 wapper2 target wapper2 wapper1

def wapper1(fn):
    def inner(*args,**kwargs):
        print('这里是wapper1 进') # 1
        ret = fn(*args,**kwargs) # 这里装饰的是wapper2,所以跳到wapper2函数
        print('这里是wapper1 出') # 5
        return ret
    return inner

def wapper2(fn):
    def inner(*args,**kwargs):
        print('这里是wapper2 进') # 2
        ret = fn(*args,**kwargs)  # 这里是最开始装饰的target,所以打印:这里是target函数
        print('这里是wapper2 出') # 4
        return ret
    return inner

@wapper1  # 2.在装饰1,target = wapper1(wapper2.inner)
@wapper2  # 1.先装饰2,target = wapper2(target) → target:wapper2.inner
def target():
    print('这里是target函数')  # 3

target()

输出:
这里是wapper1 进
这里是wapper2 进
这里是target函数
这里是wapper2 出
这里是wapper1 出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值