Python中的装饰器及其应用
- 明月装饰了你的窗子,你装饰了别人的梦
什么是装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结* 构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提 供了额外的功能。
(在不修改原有类的情况下去添加一个新的功能)
代码语言:javascript复制import time
start = time.time() #计算执行函数的时间
time.sleep(4)
end = time.time()
print(end - start)
输出:
4.000851154327393
从实际例子来看装饰器
代码语言:javascript复制def my_fun():
print("这是一个函数")
my_fun()
这个时候,如果不想修改原有的函数,又想增加一个计算时间的功能,咋整?
代码语言:javascript复制import time
def my_fun():
print("这是一个函数")
def my_time(func):
begin = time.time() #获取当前系统时间戳
time.sleep(2)
func() #直接调用函数让它去执行上面的我们传入的函数。
end = time.time()
print(end - begin)
my_time(my_fun)
#输出:
这里一个函数
2.0034534565
这种方式,因为要增加功能,导致所有的业务调用方都得进行修改,此法明显不可取。
另一种方式:
代码语言:javascript复制def print_cost(func): #这个装饰器说到底就是把我们要增加的一个功能,写在里面的一个wrapper里面,然后返回,然后在真正要修饰的一个函数里,加上@装饰器名字。
def wrapper(): #这个函数,要给my_fun()增加的功能都写在这里
begin = time.time()
time.sleep(2)
func()
end = time.time()
print(end - begin)
return wrapper
@print_cost
def my_fun(): #上面的func,就等于是print_cost(my_func),这样子的用法。
print("这里一个函数")
my_fun()
#输出:
这里一个函数
2.000412702560425
import time
def print_cost(func):
def wrapper(): #这个函数,要给my_fun()增加的功能都写在这里
begin = time.time()
time.sleep(1)
print("stop")
func()
print("start")
end = time.time()
print(end - begin)
return wrapper
@print_cost
def my_fun():
print("这里一个函数")
my_fun()
输出:
stop
这里一个函数
start
1.0000886917114258