装饰器

装饰器

  • 什么是装饰器

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

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

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

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

  • 装饰器的作用

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

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

    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

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

原文地址:https://www.cnblogs.com/YGZICO/p/11843893.html