简单装饰器
if foo()==show_time(foo) :问题解决!
所以,我们需要show_time(foo)返回一个函数对象,而这个函数对象内则是核心业务函数:执行func()与装饰函数时间计算,修改如下:
import time
def show_time(func):
def wrapper():
start_time=time.time()
func()
end_time=time.time()
print('spend %s'%(end_time-start_time))
return wrapper
def foo():
print('hello foo')
time.sleep(3)
foo=show_time(foo)
foo()
函数show_time就是装饰器,它把真正的业务方法func包裹在函数里面,看起来像foo被上下时间函数装饰了。在这个例子中,函数进入和退出时 ,被称为一个横切面(Aspect),这种编程方式被称为面向切面的编程(Aspect-Oriented Programming)。
带参数的被装饰函数
import time
def show_time(func):
def wrapper(a,b):
start_time=time.time()
func(a,b)
end_time=time.time()
print('spend %s'%(end_time-start_time))
return wrapper
@show_time #add=show_time(add)
def add(a,b):
time.sleep(1)
print(a+b)
add(2,4)
import time
def time_logger(flag=0):
def show_time(func):
def wrapper(*args,**kwargs):
start_time=time.time()
func(*args,**kwargs)
end_time=time.time()
print('spend %s'%(end_time-start_time))
if flag:
print('将这个操作的时间记录到日志中')
return wrapper
return show_time
@time_logger(3)
def add(*args,**kwargs):
time.sleep(1)
sum=0
for i in args:
sum+=i
print(sum)
add(2,7,5)
@time_logger(3) 做了两件事:
(1)time_logger(3):得到闭包函数show_time,里面保存环境变量flag
(2)@show_time :add=show_time(add)
上面的time_logger是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器(一个含有参数的闭包函数)。当我 们使用@time_logger(3)调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。