python学习笔记(14)python装饰器的应用

2021-08-16 18:05:15 浏览数 (2)

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
第二种方式并没有修改func函数的内部实现,而是使用装饰器模式对其功能进行装饰增强

0 人点赞