装饰器
一、概念
1. 装饰器(Decoration):
- 装饰器是一种设计模式,经常用来实现"面向切面的编程"(AOP: 实现在不修改源代码的情况下,给程序动态添加功能的一种技术)
2. 装饰器的作用:
- 装饰器允许向一个现有的对象(函数)添加新的功能,同时又不改变其结构
- 可以抽离出大量的函数中的和业务无关的功能
3. 应用场景:
- 插入日志、性能测试、事务处理、缓存、中间件、权限控制等
举个栗子:现在需要计算某个函数的执行时间
import time
def fun1():
start = time.time()
s = 0
for i in range(1, 100001):
s += i
print(f'和为:{s}')
t = time.time() - start
print(f'函数的执行时间为:{t:.10f}')
fun1()
def fun2():
start = time.time()
s = 1
for i in range(1, 100001):
s *= i
print(f'乘积为:{s}')
t = time.time() - start
print(f'函数的执行时间为:{t:.10f}')
fun2()
如果要把计算时间的代码抽离出来,此时就可以使用装饰器来实现
import time
def get_time(func):
def wrapper():
start = time.time()
func()
t = time.time() - start
print(f'函数的执行时间为:{t}')
return wrapper
@get_time
def fun2():
s = 1
for i in range(1, 100001):
s *= i
print(f'乘积为:{s}')
fun2()
二、装饰器详解
1、装饰器
装饰器:
1. 关键字:@,在被修饰的函数的前一行加入
2. 本质:装饰器的本质就是一个函数
3. 原理:在调用被装饰的函数时,被装饰的函数体的代码并不会被直接执行。而是在调用被装饰的函数时,将该函数传递给装饰器
2、装饰器的基本形式
并不是真正的装饰器(有问题)
# 装饰器函数必须要有一个参数,来接收被装饰的函数(名)
def my_decoration(func):
#print('这里写要装饰的东西,要给被装饰的函数添加的功能')
print('*'