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多例模式
    设计模式(四)——多例模式
    IoC是一个很大的概念,可以用不同的方式实现。
    现有的框架实际上使用以下三种基本技术的框架执行服务和部件间的绑定:
    IOC关注服务(或应用程序部件)是如何定义的以及他们应该如何定位他们依赖的其它服务
    IoC最大的好处是什么?
    Java – Top 5 Exception Handling Coding Practices to Avoid
    @Spring MVC请求处理流程
    Spring Bean的生命周期(非常详细)
  • 原文地址:https://www.cnblogs.com/datatool/p/13458209.html
Copyright © 2011-2022 走看看