• 装饰器


    """

    1、什么是装饰器

    ​ 器指的是工具/功能
    ​ 装饰指的是为被装饰对象添加额外的功能

    ​ 大白话:定义装饰器就是定义了一个函数,该函数就是用来为其他函数添加额外的功能的

    2、为何要用装饰器

    ​ 程序的开发需要遵循一个原则:开放封闭原则
    ​ 开放:指的是对拓展功能开放
    ​ 封闭:指的是对修改源代码封闭

    ​ 装饰器就是在不修改被装饰对象源代码以及调用方式的前提为被装饰对象添加上新功能

    3、如何用装饰器

    """

    1、装饰器初探

    '''

    import time
    
    
    def index(x, y):
        time.sleep(3)
        print('index===>', x, y)
    
    index(1,2)
    
    
    def home(name):
        time.sleep(2)
        print('home====>', name)
    
    home("egon")
    
    def outter():
        x = index
    
    ​    def wrapper(a, b):
    ​        start_time = time.time()
    ​        x(a, b)
    ​        stop_time = time.time()
    ​        print("run time is :%s" % (stop_time - start_time))
    
    ​    return wrapper  # 千万不要加括号
    
    
    index = outter()  # f=wrapper
    
    index(1, 2)  # wrapper()
    

    '''

    '''

    2、装饰器改进1

    #### 
    
    ​```
    """
    import time
    
    
    def index(x, y):
        time.sleep(3)
        print('index===>', x, y)
    
    def home(name):
        time.sleep(2)
        print('home====>', name)
    
    def outter(x):
    
    x = home
    
    ​    def wrapper(*args,**kargs):
    ​        start_time = time.time()
    ​        x(*args,**kargs) # x("egon")
    ​        stop_time = time.time()
    ​        print("run time is :%s" % (stop_time - start_time))
    ​    return wrapper  # 千万不要加括号
    
    index = outter(index)  # index=wrapper
    home = outter(home)  # home=wrapper
    
    
    index(1, 2)  # wrapper(1,2)
    home("egon")  # wrapper("egon")
    ​```
    
    
    """
    
    #### 
    

    3、装饰器改进2

    """
    
    import time
    
    
    def index(x, y):
        time.sleep(3)
        print('index===>', x, y)
        return 456
    
    def home(name):
        time.sleep(2)
        print('home====>', name)
        return 123
    
    
    def outter(x):
    
    x = home
    
    ​    def wrapper(*args, **kargs):
    ​        start_time = time.time()
    ​        res = x(*args, **kargs)  # x("egon")
    ​        stop_time = time.time()
    ​        print("run time is :%s" % (stop_time - start_time))
    ​        return res
    ​    return wrapper  # 千万不要加括号
    
    index = outter(index)  # index=wrapper
    home = outter(home)  # home=wrapper
    
    res1 = index(1, 2)  # wrapper(1,2)
    res2 = home("egon")  # wrapper("egon")
    print("====>",res1)
    print("====>",res2)
    
    """
    

    4、语法糖

    """
    import time
    
    
    def outter(x):
    
    x = home
    
    ​    def wrapper(*args, **kargs):
    ​        start_time = time.time()
    ​        res = x(*args, **kargs)  # x("egon")
    ​        stop_time = time.time()
    ​        print("run time is :%s" % (stop_time - start_time))
    ​        return res
    
    ​    return wrapper  # 千万不要加括号
    
    
    @outter  # index = outter(index)  # index=wrapper
    def index(x, y):
        time.sleep(3)
        print('index===>', x, y)
        return 456
    
    
    @outter  # home = outter(home)  # home=wrapper
    def home(name):
        time.sleep(2)
        print('home====>', name)
        return 123
    
    
    res1 = index(1, 2)  # wrapper(1,2)
    res2 = home("egon")  # wrapper("egon")
    print("====>", res1)
    print("====>", res2)
    """
    import time
    
    #### 5、装饰器的模板
    
    """
    def outter(func):
        def wrapper(*args, **kwargs):
            res = func(*args, **kwargs)
            return res
        return wrapper
    
    def timmer(func):
        def wrapper(*args, **kwargs):
            start=time.time()
            res = func(*args, **kwargs)
            stop=time.time()
            print(stop -start)
            return res
        return wrapper
    
    def auth(func):
        def wrapper(*args, **kwargs):
            name = input("请输入您的账号:").strip()
            pwd = input("请输入您的账号:").strip()
            if name == "egon" and pwd == "123":
                print('登录成功')
                res = func(*args, **kwargs)
                return res
            else:
                print("账号密码错误")
        return wrapper
    
    @auth
    def index(x, y):
        time.sleep(1)
        print('index===>', x, y)
        return 456
    
    @auth
    def home(name):
        time.sleep(0.5)
        print('home====>', name)
        return 123
    
    index(1,2)
    home("egon")
    """
    

    4、wraps

    '''
    from functools import wraps
    
    def timmer(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            start=time.time()
            res = func(*args, **kwargs)
            stop=time.time()
            print(stop -start)
            return res
    
    wrapper.__name__ = func.__name__
    
    wrapper.__doc__ = func.__doc__
    
    ​    return wrapper
    
    @timmer # index=timmer(index) # index=wrapper
    def index(x, y):
        """
        这是index函数的文档注释
        """
        time.sleep(1)
        print('index===>', x, y)
        return 456
    
    index(1,2)
    
    print(index.__name__)
    
    help(index)
    '''
    

    5.最完整的模板

    from functools import wraps
    
    def outter(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            res = func(*args, **kwargs)
            return res
    
    ​    return wrapper
    
  • 相关阅读:
    springboot项目引入通用mapper(tk.mybatis.mapper)的时候一些可能会踩的坑
    Zookeeper和Dubbo基本配置和调用
    Zookeeper和Dubbo介绍
    Git的基础命令大全,拉取推送,分支,合并,冲突
    Maven内置tomcat
    Maven高级,依赖传递和解决冲突,版本锁定,提取统一版本号
    SpringMvc的自定义异常,交给SpringMvc管理
    IDEA创建MavenWeb项目慢,问题根除
    Docker安装指南
    Docker容器入门
  • 原文地址:https://www.cnblogs.com/lgh8023/p/13157024.html
Copyright © 2020-2023  润新知