装饰器的概念
装饰器其实就是闭包,它的作用是在不改变源代码的情况下,在一个函数的基础上增加新的功能,使用场景特别多。
当我们写一个闭包增加函数的时候,如下:
在func1的函数功能上增加一个,打印当前时间的函数
import datetime
def show_now_time(func):
def f1(*args, **kwargs):
func(*args, **kwargs)
print("当前时间:",datetime.datetime.now())
return f1
def func1(x, y):
print("答案:", x + y)
func1 = show_now_time(func1)
func1(1,2)
上面效果与增加装饰器的效果一样,如下:
import datetime
def show_now_time(func):
def f1(*args, **kwargs):
func(*args, **kwargs)
print("当前时间:",datetime.datetime.now())
return f1
# 增加装饰器
@show_now_time
def func1(x, y):
print("答案:", x + y)
func1(1,2)
多个装饰器的使用
当需要多个装饰器使用在一个函数上时,执行步骤是先从下往上的,如下:
import datetime
def show_now_time(func):
def f1(*args, **kwargs):
func(*args, **kwargs)
print("当前时间:",datetime.datetime.now())
return f1
def print_log(func):
def f1(*args, **kwargs):
func(*args, **kwargs)
print("my logs...")
return f1
@show_now_time
@print_log
def func1(x, y):
print("答案:", x + y)
func1(1,2)
函数会先执行完自己的函数功能,然后执行print_log,再执行show_now_time。
类装饰器
类装饰器其实是调用类中的__call__属性,效果如下:
import datetime
class PrintTime:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("当前时间为:", datetime.datetime.now())
return self.func(*args, **kwargs)
@PrintTime
def f1(x, y):
print(x + y)
f1(3, 4)