• python 3.x 学习笔记5 (装饰器)


    1.装饰器

    本质是函数,(装饰其他函数)就是为其他函数添加附加功能

    原则:

      1)不能修改被装饰的函数的源代码
      2)不能修改被装饰的函数的调用方式

    2.实现装饰器知识储备

      1)函数即“变量”

      2)高阶函数

        a.把一个函数当作实参传给另一个函数(可以做到不修改被装饰函数的源代码的情况下为其添加功能)

        b.返回值中包含函数名)(不修改函数的调用方式)

      3)嵌套函数

    3.高阶函数+嵌套函数=》装饰器

    4.初步装饰器

    import time
    def timer(func):              #timer(test1)  func = test1
        def deco():
            start_time = time.time()
            func()                #run test1
            stop_time = time.time()
            print('the func run time is %s'%(stop_time-start_time))
        return deco
    
    @timer              #test1 = timer(test1)
    def test1():
        time.sleep(3)
        print('in the test1')
    test1()

    5.功能比较完善的装饰器

    user,passwd = 'hsj','1234'
    
    def auth(auth_type):
        print('auth func:',auth_type)
        def outer_wrapper(func):
            def wrapper(*args, **kwargs):
                print('wrapper:',*args, **kwargs)
                if auth_type == 'local':
                    username = input('Username:').strip()
                    password = input('Password:').strip()
    
                    if username == user and password == passwd:
                        print('33[32;1mUser has pass authentication33[0m')
                        return func(*args, **kwargs)  # from home         #函数wrapper的返回值
                    else:
                        exit('33[31;1mInvalid username or password33[0m')
                elif auth_type =='ldap':
                    print('ldappppppppp')
            return wrapper
        return outer_wrapper
    
    def index():
        print('welcome to index psge')
    @auth(auth_type='local')      # 加了括号相当于运行了outer_wraper所以会执行里面内容   # home = auth(home)
    def home():
        print('welcome to home page')
        return 'from home'         #这里有返回值在装饰器里也应该有个返回值不然是print()不出来的
    @auth(auth_type='ldap')
    def bbs():
        print('welcome to bbs page')
    
    index()
    print(home())
    bbs()
  • 相关阅读:
    bzoj 3572 [Hnoi2014]世界树 (虚树+树形dp)
    2018 计算之道初赛第二场 阿里巴巴的手机代理商(困难)(反向可持久化Trie)
    hdu 3089 (快速约瑟夫环)
    Codeforces Round #479 (Div. 3)
    牛客练习赛17
    BNU校赛总决赛J 小白兔小灰兔 相交计算几何模板
    2018BNU校赛总决赛
    Educational Codeforces Round 43 (Rated for Div. 2) ABCDE
    Codeforces Round #478 (Div. 2) ABCDE
    牛客练习赛 16
  • 原文地址:https://www.cnblogs.com/hsj-jingyu/p/8338178.html
Copyright © 2020-2023  润新知