一 概念
装饰器:本质是一个python函数,它可以让其他函数在不改变代码的前提下,添加额外的功能,装饰器的返回值也是一个函数对象。
二 使用场景:插入日志,权限验证、性能测试、事务处理、缓存等场景。
三 装饰器的示例:
1.单个装饰器
import time
# 给test1函数添加计时器功能def dec(func):
def wrapper(*args, **kwargs):
start_time = time.time()
ret = func(*args, **kwargs)
end_time = time.time()
# 程序执行的时间
proc_time = (end_time-start_time)*1000
print("1-10000数字相加的结果是%d运行的时间是%dms" % (ret,proc_time))
return wrapper
@dec # 装饰器dec的作用是:test1 = dec(test1)
def test1():
sum = 0
for i in range(1,10001):
sum += i
return sum
if __name__ == '__main__':test1()
~需求升级:在不使用装饰器的情况下,实现上一个功能(实际开发中基本不用这个方式)
答:只需要把@dec注释,在入口函数(if __name__ == '__main__':)的上一行添加一行代码
test1 = dec(test1) 即可,示例如下:
import time
# 给test1函数添加计时器功能def dec(func):
def wrapper(*args, **kwargs):
start_time = time.time()
ret = func(*args, **kwargs)
end_time = time.time()
# 程序执行的时间
proc_time = (end_time-start_time)*1000
print("1-10000数字相加的结果是%d运行的时间是%dms" % (ret,proc_time))
return wrapper
# @dec # 装饰器dec的作用是:test1 = dec(test1)
def test1():
sum = 0
for i in range(1,10001):
sum += i
return sum
test1 = dec(test1)
if __name__ == '__main__':
test1()
2.两个装饰器:
def say_hi(func):
print('.....say_hi........')
def wrapper1(*args, **kwargs):
print('.....wrapper1........')
func(*args, **kwargs)
return wrapper1
def say_hello(func1):
def wrapper2(*args, **kwargs):
print('.....wrapper2........')
func1(*args, **kwargs)
return wrapper2
@say_hello
def test1(): # 装饰器作用 test1 ——> wrapper1 ; func ——> wrapper2 ; func1 ——> test1
print('.....test1........')
if __name__ == '__main__':test1()
"""
输出的结果是:
.....say_hi........
.....wrapper1........
.....wrapper2........
.....test1........
"""
装饰的顺序: 挨着函数(test1)近的(say_hello)先装饰,远的(say_hi)后装饰, 执行顺序是先执行远的再执行近的。
参考:Python 装饰器:http://python.jobbole.com/82344/