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()
  • 相关阅读:
    第二章 课后习题 6
    第二章 课后习题 5
    第一章 课后习题 10
    第一章 课后习题 7
    JAVA练习1
    作业2
    作业
    c++作业10月13日作业
    c++作业50页例题3.1
    for循环作业4和5
  • 原文地址:https://www.cnblogs.com/hsj-jingyu/p/8338178.html
Copyright © 2011-2022 走看看