装饰器是Python中非常有用的功能,它们允许我们以简洁的方式添加功能到已有的函数或方法上,而无需修改其内部代码。
装饰器允许通过将现有函数传递给装饰器,从而向现有函数添加一些额外的功能,该装饰器将执行现有函数的功能和添加的额外功能。装饰器本质上还是一个函数,它可以让已有的函数不做任何改动的情况下增加功能。
例1:装饰器用于计算并打印被装饰函数的执行时间
import time
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')
def timeit(func):
"""
装饰器函数,用于计算并记录被装饰函数的执行时间。
参数:
func (function): 需要被装饰的函数。
返回:
function: 返回包装后的函数。
"""
def wrapper(*args, **kwargs):
"""
包装函数,记录执行时间后调用原函数。
参数:
*args (tuple): 可变长度的参数列表。
**kwargs (dict): 关键字参数字典。
返回:
any: 返回调用原函数的结果。
"""
# 记录开始时间
start_time = time.time()
# 调用原函数并获取结果
result = func(*args, **kwargs)
# 记录结束时间
end_time = time.time()
# 计算执行时间
elapsed_time = end_time - start_time
# print(f'{func.__name__} took {elapsed_time:.4f} seconds to complete.')
# 打印执行时间信息
logging.info(f'{func.__name__} took {elapsed_time:.4f} seconds to complete.')
# 返回原函数的结果
return result
return wrapper
@timeit
def some_function():
"""
一个示例函数,模拟一些耗时的操作。
"""
time.sleep(2) # 模拟一个耗时操作,这里暂停2秒
print('some_function has finished execution.')
# 调用装饰后的函数
some_function()
some_function has finished execution.
2024-12-03 22:52:46,430 some_function took 2.0001 seconds to complete.
例2:用于在执行被装饰的函数前记录警告日志
import logging
def use_log(func):
"""
装饰器函数,用于在执行被装饰的函数前记录警告日志。
参数:
func (function): 需要被装饰的函数。
返回:
function: 返回包装后的函数。
"""
def wrapper(*args, **kwargs):
"""
包装函数,执行日志记录后调用原函数。
参数:
*args (tuple): 可变长度的参数列表。
**kwargs (dict): 关键字参数字典。
返回:
any: 返回调用原函数的结果。
"""
# 记录一条包含将要执行的函数名称的警告日志
logging.warning('%s is running' % func.__name__)
# 调用原函数并返回其结果
return func(*args, **kwargs)
return wrapper
@use_log
def bar():
"""
测试函数,打印字符串。
"""
print('I am bar')
@use_log
def haha():
"""
另一个测试函数,打印字符串。
"""
print('I am haha')
# 调用装饰后的函数
bar()
haha()
#
# ------------结果如下------------
# WARNING:root:bar is running
# I am bar
# WARNING:root:haha is running
# I am haha