一、装饰器的功能
一、装饰器可以在不改动函数原代码和代码执行方式的同时,为某个函数添加新的功能,可以使得代码更简洁。
同时,不改变源代码的特性,可以避免在更改源代码时,可能发生的牵一发而动全身的错误发生,导致原本运行正常的程序发生难以矫正的错误。
二、不改变代码的执行方式,例如:
在公司中,某函数的调用方式本为foo(),
当为它加入新功能时,因为不使用装饰器,使得要使用新功能需要执行额外的代码,例如可能的:stat_time(foo)。而因为公司不止你一人使用该新功能,但是其他人都习惯了原本foo()这样简单明了的函数调用方法,此时为了使得原调用方法同样能实现该新功能,就可以使用装饰器。
二、一个简单的统计某函数执行时间的装饰器代码实现
例如:
import time
def stat_time(function): #时间统计函数
def inner(*args,**kwargs):
start_time = time.time()
function(*args,**kwargs)
finish_time = time.time()
print("op_time :%f\n"%(finish_time-start_time))
return inner
#该装饰器的重点在于高阶函数的运用
def ccs():
print('ccs......')
time.sleep(2) #代码运行时间过短,增加暂停方便记录运行时间
ccs = stat_time(ccs)
ccs()
@stat_time #等价于prent = stat_time(prent)
def prent():
print('present......')
time.sleep(2)
prent()
@stat_time
def add(*args,**kwargs): #求和
num = 0
for i in args:
num+=i
print(num)
time.sleep(2)
add(3,4,4,5)
输出:
ccs......
op_time :2.000534
present......
op_time :2.000541
16
op_time :2.000664
二、装饰器内加装新功能(日志记录):
import time
def show_time(floger=''):
def stat_time(function): #时间统计函数
def inner(*args,**kwargs):
start_time = time.time()
function(*args,**kwargs)
finish_time = time.time()
print("op_time :%f"%(finish_time-start_time))
if floger=='true':
print('日志记录\n')
return inner
return stat_time
#该装饰器的重点在于高阶函数的运用
@show_time()
def ccs():
print('ccs......')
time.sleep(2)
ccs()
@show_time('true')
def prent():
print('present......')
time.sleep(2)
prent()
@show_time('true')
def add(*args,**kwargs):
num = 0
for i in args:
num+=i
print(num)
time.sleep(2)
add(3,4,4,5)
输出:
ccs......
op_time :2.000159
present......
op_time :2.000657
日志记录
16
op_time :2.000106
日志记录