zoukankan      html  css  js  c++  java
  • 装饰器

    装饰器

    • 什么是装饰器

    ‘装饰’代指为被装饰对象添加新的功能,’器‘代指器具/工具

    • 装饰器必须遵循“开放封闭”原则

      开放:对函数功能的添加是开放的

      封闭:对函数功能的修改是封闭的

    • 装饰器的作用

      在不修改被装饰对象源代码和调用方式的前提下,添加新功能

    • 装饰器的定义必须遵循:

      1.不修改被装饰对象源代码

      2.不修改被装饰对象调用方式

    • 为什么使用装饰器

    可以解决代码冗余问题,提高代码的可读性

    • 怎么使用装饰器
      • 装饰器的应用
        • 统计时间
        • 登录认证
      • 编写装饰器
        • 通过闭包函数来实现装饰器
    import time
    
    def index():
        time.sleep(3)
        print('welcome to the index page')
        return 200
    
    
    def timer(func):
        def wrapper():          # 引用外部作用域的变量func
            start_time = time.time()
            res = func()
            stop_time = time.time()
            print(f'run time is {stop_time - start_time}')
            return res
        return wrapper
    
    
    index = timer(index)    # 得到index=wrapper,wrapper携带对外作用域的引用:func=原始的index
    index()     # 执行的是wrapper(),在wrapper的函数体内再执行最原始的index
    

    叠加装饰器

    ​ 在同一个被装饰对象中,添加多个装饰器,并执行

    • 叠加装饰器的顺序
      • 装饰的顺序:由下往上的装饰
      • 执行的顺序:由上往下的执行
    • 每一个新的功能都应该写一个新的装饰器
    • 否则会导致代码冗余,结构不清晰,可扩展性差

    无参装饰器

    ​ 装饰在被装饰对象时,没有传参数的装饰器

    有参装饰器

    ​ 装饰在被装饰对象时,传入参数的装饰器

    ​ 比如,某些时候我们需要给用户的权限进行分类,需要传参

    装饰器的语法糖

    ​ 语法糖是Python内置的,可以引用所有的装饰器

    ​ @ 就是语法糖

    语法糖如何使用:

    @ 装饰器
    def 被装饰对象():
        pass
    

    注意:使用语法糖时,必须遵循,装饰器的定义必须在被装饰对象之上

  • 相关阅读:
    机器学习之朴素贝叶斯
    机器学习之KNN
    格式化数字
    web.xml中load-on-startup的作用
    ExecutorService线程池
    201404转成 2014.04
    DBCP连接池配置示例
    java 写文本换行
    打印IP 来源
    MySQL分库分表的一些技巧
  • 原文地址:https://www.cnblogs.com/YGZICO/p/11843893.html
Copyright © 2011-2022 走看看