zoukankan      html  css  js  c++  java
  • 装饰器(2)

    1 什么是装饰器
    器=》工具=》函数
    装饰=》指的是为被装饰者添加新功能



    2、为何要用装饰器
    开放封闭原则:
    封闭指的是对修改源代码是封闭的
    开放指的是对拓展新功能是开放的

    装饰器就是一个函数,该函数就是在不修改被装饰对象源代码以及调用的方式的前提下,为被装饰对象添加额外的功能

    3、如何实现装饰器=》闭包函数
    装饰器的目标:为被装饰对象添加额外的新功能
    装饰器的实现应该遵循的原则:
    1、不该被装饰对象的源代码
    2、不该被装饰对象的调用方式
    4.示例
    # 例1:
    import time
    
    def index():
        start=time.time()
        print("index===>")
        time.sleep(0.5)
        stop=time.time()
        print("run time is : %s" %(stop - start))
    
    index()
    
    # 例2:
    import time
    
    def index():
        print("index===>")
        time.sleep(0.5)
    
    
    start=time.time()
    index()
    stop=time.time()
    print("run time is : %s" %(stop - start))
    
    
    # 例3:
    import time
    
    def index():
        print("index===>")
        time.sleep(0.5)
    
    
    def wrapper():
        start=time.time()
        index()
        stop=time.time()
        print("run time is : %s" %(stop - start))
    
    wrapper()
    
    # 例4:直接通过参数为函数体传参
    import time
    
    def index():
        print("index===>")
        time.sleep(0.5)
    
    
    def wrapper(func):
        start=time.time()
        func()
        stop=time.time()
        print("run time is : %s" %(stop - start))
    
    wrapper(index)
    
    
    # 例5:直接通过参数为函数体传参
    import time
    
    def index():
        print("index===>")
        time.sleep(0.5)
    
    
    def outter(func):
        # func=index的内存地址
        def wrapper():
            start=time.time()
            func()
            stop=time.time()
            print("run time is : %s" %(stop - start))
        return wrapper  # 千万不要加括号
    
    index=outter(index)
    
    index() # wrapper()
    
    
    
    # 例6:
    import time
    
    def index(x,y,z):
        print("index===>",x,y,z)
        time.sleep(0.5)
        return 123
    
    def home(name):
        print('welcome %s to home page' %name)
        time.sleep(1)
    
    # index(1,2,3)
    # home("egon")
    
    def outter(func):
        # func=index的内存地址
        def wrapper(*args,**kwargs):
            start=time.time()
            res=func(*args,**kwargs)
            stop=time.time()
            print("run time is : %s" %(stop - start))
            return res
        return wrapper  # 千万不要加括号
    
    index=outter(index)
    res=index(1,2,3) # wrapper(1,2,3)
    print(res)
    
    home=outter(home)
    res=home("egon")
    print(res)
    
    
    # 例7:语法糖
    import time
    from functools import wraps
    
    def timmer(func):
        @wraps(func)
        def wrapper(*args,**kwargs):
            start=time.time()
            res=func(*args,**kwargs)
            stop=time.time()
            print("run time is : %s" %(stop - start))
            return res
        # wrapper.__name__=func.__name__
        # wrapper.__doc__=func.__doc__
        return wrapper  # 千万不要加括号
    
    @timmer  # index=timmer(index)
    def index(x,y,z):
        """
        index的文档注释
        """
        print("index===>",x,y,z)
        time.sleep(0.5)
        return 123
    
    @timmer  # home=timmer(home)
    def home(name):
        """
        home的文档注释
        """
        print('welcome %s to home page' %name)
        time.sleep(1)
    
    res=index(1,2,3) # wrapper(1,2,3)
    print(res)
    
    res=home("egon")
    print(res)
    
    
    # help(index)
    print(index.__name__)
    
    # 例8:
    def auth(func):
        def wrapper(*args,**kwargs):
            name=input("username>>: ").strip()
            pwd=input("password>>: ").strip()
            if name == "egon" and pwd == "123":
                print('login successful')
                res=func(*args,**kwargs)
                return res
            else:
                print("username or password error")
        return wrapper
    
    @auth
    def index():
        print('from index')
    
    index()
    View Code
  • 相关阅读:
    项目计划进度控制与资源管理
    读大道至简所思
    Java自学第三十二天
    Java自学第三十一天
    Java自学第三十天
    Java自学第二十九天
    Java自学第二十八天
    Java自学第二十七天
    Java自学第二十六天
    Java自学第二十五天
  • 原文地址:https://www.cnblogs.com/datatool/p/13458209.html
Copyright © 2011-2022 走看看