装饰器
- 什么是装饰器
‘装饰’代指为被装饰对象添加新的功能,’器‘代指器具/工具
-
装饰器必须遵循“开放封闭”原则
开放:对函数功能的添加是开放的
封闭:对函数功能的修改是封闭的
-
装饰器的作用
在不修改被装饰对象源代码和调用方式的前提下,添加新功能
-
装饰器的定义必须遵循:
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
注意:使用语法糖时,必须遵循,装饰器的定义必须在被装饰对象之上