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('小四','消消乐')
    

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

  • 相关阅读:
    [BZOJ3530][SDOI2014]数数
    [Luogu3121][USACO15FEB]审查Censoring
    [BZOJ1212][HNOI2004]L语言
    [Luogu3041][USACO12JAN]视频游戏的连击Video Game Combos
    AC自动机总结
    (三)LDAP 新增用户
    (二) LDAP 安装
    (一)LDAP 简介
    (十三)VMware Harbor 身份验证模式
    loj#2541. 「PKUWC2018」猎人杀
  • 原文地址:https://www.cnblogs.com/cndeveloper/p/14397418.html
Copyright © 2011-2022 走看看