Python函数系列之装饰器(三)
在Python中,装饰器的本质就是Python中的一个函数,其来源自Python面向对象。装饰器是在函数调用之上的修饰。这些修饰仅是当声明一个函数或方法的时候,才会被应用额外的调用。有点类似Java中的AOP(面向方面编程)。同时在设计模式中,还有装饰器模式,也即是:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。原则是:不修改被修饰函数的源代码,不修改被修饰函数的调用方式。
装饰器的用途:
引入日志
增加计时逻辑来检测性能
给函数加入事务的能力
权限校验
缓存
执行函数前/后的预备或清理功能等
例子:
# -*- coding: utf-8 -*-import timedef deco(func): #func = test1或test2 def wrapper(): start_time = time.time(); func(); #就是运行 test1()或者test2()函数 end_time = time.time(); print("此模块运行时间为:%s" %(end_time - start_time)); return wrapper;def test1(): time.sleep(3); print("函数Test1运行结束");def test2(): time.sleep(3); print("函数Test2运行结束")#在没用使用装饰器调用时,如下调用test1 = deco(test1) #返回的wrapper函数地址test1() #执行的wrapper()test2 = deco(test2)test2()#若上面函数有上百上千个,都是那样调用,都是重复的代码调用,在Python中,使用@语法糖#例如下面定义一个test3函数@deco #就相等于 test3 = deco(test3)def test3(): time.sleep(3); print("函数Test-3运行结束");test3()
运行结果如下:
函数Test1运行结束
此模块运行时间为:3.000406265258789
函数Test2运行结束
此模块运行时间为:3.000087261199951
函数Test-3运行结束
此模块运行时间为:3.000718355178833
Process finished with exit code 0
装饰器的语法以@开头,接着是装饰器函数的名字和可选的参数。紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数。
例如如下:
@decorator(dec_opt_args)
def func(func_opt_args):
......
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。