1、装饰器
- Python装饰器(Decorator)是一个修改其他函数或类的行为的函数。它接受一个函数作为参数,并返回一个新的函数。装饰器本质上是一个函数,它让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
2、实现
2.1、简单理解
- 本质上讲,装饰器就是通过将原来函数作为参数进行传递,不改变原有功能的情况下,增加了一些新功能。
def square(x):
return x*x
def print_running(f, x):
print(f'{f.__name__} 被调用')
return f(x)
result = print_running(square, 2)
result
2.2、进阶
- 将上述print_running做更改,将原函数打包。
def square(x):
return x*x
def print_running(func):
def wrapper(*args, **kwargs):
print(f'{func.__name__} 被调用')
return func(*args, **kwargs)
return wrapper
square_d = print_running(square)
square_d(2)
2.3、最终
import time
def decorate(func):
def wrapper(*args, **kwargs):
print(f'{func.__name__} 被调用')
start_time = time.time()
time.sleep(0.1)
result = func(*args, **kwargs)
end_time = time.time()
print(f'{func.__name__} 运行时间:{end_time - start_time} 秒')
return result
return wrapper
def square(x):
return x*x
square_ = decorate(square)
print('函数名:',square_.__name__)
square_(2)
- 在这里,发现使用装饰器打包函数之后,函数名称变成了wrapper,需要改变代码,让它继承原有的名称。增加@functools.wraps(func)行
import time
import functools
def decorate(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f'{func.__name__} 被调用')
start_time = time.time()
time.sleep(0.1)
result = func(*args, **kwargs)
end_time = time.time()
print(f'{func.__name__} 运行时间:{end_time - start_time} 秒')
return result
return wrapper
def square(x):
return x*x
square_ = decorate(square)
print('函数名:',square_.__name__)
square_(2)
2.4、简便调用
import time
import functools
def decorate(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f'{func.__name__} 被调用')
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f'{func.__name__} 运行时间:{end_time - start_time} 秒')
return result
return wrapper
@decorate
def square(x):
return x*x
square(2)