python入门到精通python装饰器的应用详解

Posted 大数据小禅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python入门到精通python装饰器的应用详解相关的知识,希望对你有一定的参考价值。

🚀 作者 :“大数据小禅”

🚀 粉丝福利 :加入小禅的大数据社群

🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬

目录

Python中的装饰器及其应用

  • 明月装饰了你的窗子,你装饰了别人的梦
什么是装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结*
构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提
供了额外的功能。

在不修改原有类的情况下去添加一个新的功能
import time
start = time.time()     #计算执行函数的时间
time.sleep(4)
end = time.time()
print(end - start)

输出:
4.000851154327393
从实际例子来看装饰器
def my_fun():
   print("这是一个函数")
my_fun()
这个时候,如果不想修改原有的函数,又想增加一个计算时间的功能,咋整?
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   

这种方式,因为要增加功能,导致所有的业务调用方都得进行修改,此法明显不可取。

另一种方式:
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函数的内部实现,而是使用装饰器模式对其功能进行装饰增强

以上是关于python入门到精通python装饰器的应用详解的主要内容,如果未能解决你的问题,请参考以下文章

python入门到精通python函数式编程与应用详解

python入门到精通python函数式编程与应用详解

Python基础知识详解 从入门到精通类与对象

python入门基础-函数装饰器的理解

python语言中的装饰器详解

python入门装饰器的理解