Python 函数装饰器:增强函数功能的优雅方式329


Python 提供了一种强大的机制来增强函数的功能,而无需修改函数本身的代码,这就是函数装饰器 (Decorator)。 它们允许你在不改变原函数定义的情况下,为函数添加额外的功能,例如日志记录、计时、权限验证等等。理解和掌握函数装饰器是提升 Python 编程水平的关键。

什么是函数装饰器?

简单来说,函数装饰器就是一个接受函数作为输入并返回一个新函数的高阶函数。这个新函数通常会包装原始函数,并在调用原始函数前后执行一些额外的操作。 这使得代码更简洁、可读性更高,并且易于维护。

基础示例:

让我们来看一个简单的例子,演示如何使用装饰器来打印函数执行前后的信息:```python
import functools
def my_decorator(func):
@(func) # 保持原始函数的元信息
def wrapper(*args, kwargs):
print("函数执行前")
result = func(*args, kwargs)
print("函数执行后")
return result
return wrapper
@my_decorator
def say_hello(name):
print(f"Hello, {name}!")
say_hello("World")
```

这段代码中,`my_decorator` 就是一个装饰器。它接受函数 `say_hello` 作为输入,并返回一个名为 `wrapper` 的新函数。 `wrapper` 函数在调用 `say_hello` 之前和之后分别打印信息。 `@(func)` 是一个重要的细节,它会将 `wrapper` 函数的元信息(例如 `__name__` 和 `__doc__`)设置为原始函数 `func` 的元信息,这有助于保持代码的可读性和调试性。

更高级的应用:

装饰器的应用远不止于此。以下是一些更高级的用法:

1. 计时装饰器:```python
import time
import functools
def timeit(func):
@(func)
def wrapper(*args, kwargs):
start_time = ()
result = func(*args, kwargs)
end_time = ()
print(f"函数 {func.__name__} 执行时间: {end_time - start_time:.4f} 秒")
return result
return wrapper
@timeit
def slow_function():
(2)
return "Slow function completed"
slow_function()
```

这个装饰器测量函数的执行时间。

2. 日志记录装饰器:```python
import logging
import functools
def log_execution(func):
@(func)
def wrapper(*args, kwargs):
(f"调用函数 {func.__name__} with arguments: {args}, {kwargs}")
result = func(*args, kwargs)
(f"函数 {func.__name__} 返回值: {result}")
return result
return wrapper
(level=)
@log_execution
def add(a, b):
return a + b
add(5, 3)
```

这个装饰器将函数的调用和返回值记录到日志文件中。

3. 权限验证装饰器:```python
import functools
def require_permission(permission):
def decorator(func):
@(func)
def wrapper(*args, kwargs):
if permission not in ['admin', 'user']: # 简单的权限检查
raise PermissionError("Insufficient permissions")
return func(*args, kwargs)
return wrapper
return decorator
@require_permission('admin')
def admin_only():
print("This is an admin-only function")
@require_permission('user')
def user_function():
print("This is a user function")
admin_only()
user_function()
#尝试调用admin_only()但是权限不足的情况,注释取消后运行会报错
#@require_permission('guest')
#def guest_only():
# print("This is a guest-only function")
#
#guest_only()
```

这个装饰器检查调用者是否具有执行函数所需的权限。

4. 参数化装饰器:

如上例的`require_permission`所示,装饰器本身也可以接受参数,增加其灵活性。

装饰器堆叠:

你可以将多个装饰器应用于同一个函数,它们将按照从上到下的顺序执行。```python
@my_decorator
@timeit
def say_hello_again(name):
print(f"Hello again, {name}!")
say_hello_again("Python")
```

Python 函数装饰器是一种简洁而强大的工具,它可以显著提高代码的可重用性、可读性和可维护性。 通过巧妙地运用装饰器,你可以轻松地为函数添加各种额外的功能,而无需修改函数本身的代码。 熟练掌握装饰器是成为一名优秀 Python 程序员的重要一步。

2025-06-10


上一篇:Python文件编码问题及解决方案:彻底解决乱码难题

下一篇:Python中变量类型非字符串的常见情况及解决方法