Python:装饰器是如何调用的

应用举例:
(1)装饰器

# 装饰器的调用:
# 一旦用上装饰器会: 
# 第一步:调outer函数
# 第二步:被装饰的函数play_game会被当作参数fn给outer
# 第三步:最后调用play_game时,对应的是outer函数中的返回值:retrun inner

def outer(fn):
    print('我是外部函数')
    def inner(name,game,**kwargs):
        clock = kwargs.get('clock',21) # 获取clock的值,给个默认值21
                                       # clock = kwargs['clock'] 采用这种方式获取clock虽然也可以,但是为了预防外部不传clock导致报错,
        if clock >= 21:
            print('太晚了,该睡觉了')
        else:
            fn(name,game)
        print('我是内部函数')
    return inner

@outer # 装饰器
def play_game(name,game):
    print(name,'在打',game)

play_game('zhangsan','植物大战僵尸',clock = 22)

(2)装饰器-高级用法

# 装饰器-高级用法的调用:
# 一旦用上高级装饰器会:
# 第一步:调用Outer函数,并将参数10当作参数clock传给Outer
# 第二步:再调用inner_1方法,把play_game传递给fn
# 第三步:此时再调用play_game('小四','消消乐'),其实调用的就是inner_2,对应return值inner_2 -> inner_1
def Outer(clock):
    print('我是外层函数')
    def inner_1(fn):
        print('我是内层函数1')
        def inner_2(name,game):
            print('我是内层函数2')
            if clock < 21:
                fn(name,game)
            else:
                print('太晚了,不能玩游戏了')
        return inner_2
    return inner_1

@Outer(10)
def play_game(name,game):
    print(name,'正在玩儿',game,sep='')

play_game('小四','消消乐')

高级装饰器的图解参考:
在这里插入图片描述

 

posted @ 2021-02-11 10:43  唯爱编程  阅读(259)  评论(0编辑  收藏  举报