zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    SA (后缀数组) 学习笔记
    loj2318 「NOIP2017」宝藏[状压DP]
    hdu4352 XHXJ's LIS[数位DP套状压DP+LIS$O(nlogn)$]
    【鸽】poj3311 Hie with the Pie[状压DP+Floyd]
    P1879 [USACO06NOV]玉米田Corn Fields[轮廓线DP]
    hdu4507 吉哥系列故事——恨7不成妻[数位DP]
    BZOJ3329 Xorequ[数位DP+递推矩阵快速幂]
    poj1015 Jury Compromise[背包]
    hdu3586 Information Disturbing[二分答案+树形DP]
    BZOJ4247 挂饰[背包]
  • 原文地址:https://www.cnblogs.com/hsj-jingyu/p/8338178.html
Copyright © 2011-2022 走看看