Python装饰器是一种非常有用的功能,它允许我们以不修改原有函数代码的方式,扩展或增强函数的行为。装饰器本质上是一个函数,它接收一个函数作为参数并返回一个新的函数。下面我将详细讲解Python装饰器的概念、用法和实现。
1. 装饰器的基本概念
装饰器的基本语法如下:
def decorator(func):
def wrapper(*args, **kwargs):
# 在函数执行前做一些操作
result = func(*args, **kwargs)
# 在函数执行后做一些操作
return result
return wrapper
@decorator
def function_to_decorate():
pass
在这里,@decorator
是一个语法糖,它等同于 function_to_decorate = decorator(function_to_decorate)
。
2. 装饰器的用法
装饰器可以用于以下场景:
- 日志记录
- 权限校验
- 性能测试
- 事务处理
- 缓存等
3. 装饰器的实现
以下是一个简单的装饰器示例,用于计算函数执行时间:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__}执行时间为:{end_time - start_time}秒")
return result
return wrapper
@timer
def example_function():
time.sleep(1)
example_function()
输出结果为:
example_function执行时间为:1.000123456秒
4. 带参数的装饰器
装饰器本身也可以接收参数,这样可以让装饰器更加灵活。以下是一个带参数的装饰器示例:
def repeat(num):
def decorator(func):
def wrapper(*args, **kwargs):
for i in range(num):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def say_hello():
print("Hello!")
say_hello()
输出结果为:
Hello!
Hello!
Hello!
5. 保留原函数的元信息
使用装饰器时,原函数的元信息(如函数名、文档字符串等)可能会丢失。为了解决这个问题,可以使用 functools.wraps
装饰器:
from functools import wraps
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
# 省略其他代码
return func(*args, **kwargs)
return wrapper
标签:return,Python,kwargs,讲解,func,time,装饰,def
From: https://blog.csdn.net/m0_62780716/article/details/143219971