Python装饰器/修饰器(Decorator)
一、装饰器作用
不改变函数内部语句和结构,为函数增添新的功能。因为在Python中函数也是一个对象,且可以被赋值给变量,所以也可以通过变量调用函数。如
def foo():
print("i am foo")
if __name__=="__main__":
a=foo
a()
二、装饰器调用基本格式
@decorator
def foo():
print("i am foo")
相当于decorator(foo)。根据装饰器是否有参数,可以有多层嵌套形式。
(1)二层嵌套(装饰器无参数)
1. 装饰器无参数,函数无返回值、无参数
import time
def de_time(func):
def wrapper():
t1=time.time()
func()
t2=time.time()
print('运行时间为:%0.8f'%(t2-t1))
return wrapper
@de_time #装饰器无参数
#函数无返回值无参数
def feib():
a=0;
for i in range(2,100000+1):
if i%2==0:
a+=1
print(a)
if __name__=="__main__":
feib()
2. 装饰器无参数,函数有返回值、无参数
import time
def de_time(func):
def wrapper():
t1=time.time()
f=func()
t2=time.time()
print('运行时间为:%0.8f'%(t2-t1))
return f
return wrapper
@de_time #装饰器无参数
#函数有返回值无参数
def feib():
a=0;
for i in range(2,100000+1):
if i%2==0:
a+=1
return a
if __name__=="__main__":
print( feib())
3. 装饰器无参数,函数有返回值、有参数
import time
def de_time(func):
def wrapper(*args):
t1=time.time()
f= func(*args)
t2=time.time()
print('运行时间为:%0.8f'%(t2-t1))
return f
return wrapper
@de_time #装饰器无参数
#函数有返回值有参数
def feib(n):
a=0;
for i in range(2,n+1):
if i%2==0:
a+=1
return a
if __name__=="__main__":
print(feib(100000))
(2)三层嵌套(装饰器有参数)
import time
def add_text(text):
def de_time(func):
def wrapper(*args):
t1=time.time()
f=func(*args)
t2=time.time()
print('装饰器参数是%s'%text)
print('运行时间为:%0.8f'%(t2-t1))
return f
return wrapper
return de_time
@add_text('i am who') #装饰器参数‘i am who’
def feib(n):
a=0;
for i in range(2,n+1):
if i%2==0:
a+=1
return a
if __name__=="__main__":
print(feib(100000))