zoukankan      html  css  js  c++  java
  • 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('小四','消消乐')
    

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

  • 相关阅读:
    docker常用操作
    docker-vlanhost
    打补丁说明
    mycat RULEs
    头晕的android SDK Manager and 找不到真机
    高格-一些特点的话题【抛入抛出关联】
    流程配置中心中的委托设置无法查看全部流程的问题
    验证flash player 是否正常
    kdpkg安装包解压
    go新环境Mac安装,包含okexchain
  • 原文地址:https://www.cnblogs.com/cndeveloper/p/14397418.html
Copyright © 2011-2022 走看看