上一篇
Python函数装饰器完全指南 - 从入门到精通
- Python
- 2025-07-16
- 774
Python函数装饰器完全指南
掌握Python装饰器核心概念,提升代码复用性与可维护性
什么是函数装饰器?
装饰器(Decorator)是Python中一种强大的语法特性,允许在不修改原始函数代码的情况下,动态地增强函数的行为。
本质上,装饰器是一个接受函数作为参数并返回新函数的高阶函数。通过@语法糖,我们可以优雅地为函数添加额外功能。
装饰器核心概念:
- 不修改原函数代码实现功能扩展
- 遵循"开放封闭"原则
- 提高代码复用性和可维护性
- 广泛用于日志记录、权限验证、性能测试等场景
装饰器基本语法
装饰器的基本结构非常简单:
def decorator(func):
def wrapper(*args, **kwargs):
# 执行前的操作
result = func(*args, **kwargs) # 调用原函数
# 执行后的操作
return result
return wrapper
@decorator
def my_function():
# 函数实现
pass
使用装饰器时,只需在目标函数前添加@decorator_name
即可应用装饰器。
1基础装饰器示例
创建一个简单的计时装饰器:
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"函数 {func.__name__} 执行耗时: {end - start:.4f}秒")
return result
return wrapper
@timer_decorator
def calculate_sum(n):
s = 0
for i in range(n):
s += i
return s
calculate_sum(1000000)
2带参数的装饰器
创建可配置的装饰器:
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator_repeat
@repeat(num_times=3)
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
类装饰器
除了函数装饰器,Python还支持类装饰器:
class CountCalls:
def __init__(self, func):
self.func = func
self.num_calls = 0
def __call__(self, *args, **kwargs):
self.num_calls += 1
print(f"函数 {self.func.__name__} 已被调用 {self.num_calls} 次")
return self.func(*args, **kwargs)
@CountCalls
def say_hello():
print("Hello!")
say_hello()
say_hello()
内置装饰器
Python标准库提供了一些有用的内置装饰器:
@staticmethod
创建静态方法,不需要访问实例或类
class MyClass:
@staticmethod
def static_method():
print("静态方法")
@classmethod
创建类方法,第一个参数为类本身
class MyClass:
@classmethod
def class_method(cls):
print(f"类方法 {cls}")
@property
将方法转换为属性访问器
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value > 0:
self._radius = value
装饰器最佳实践
- 使用functools.wraps保留元数据 - 保持原函数的名称、文档字符串等属性
- 避免过度嵌套 - 多层装饰器会降低代码可读性
- 明确命名 - 装饰器名称应清晰表达其功能
- 考虑性能影响 - 装饰器会增加函数调用开销
- 优先使用无参装饰器 - 简化设计,除非需要配置
from functools import wraps
def log_decorator(func):
@wraps(func) # 保留原函数元数据
def wrapper(*args, **kwargs):
print(f"调用函数: {func.__name__}")
return func(*args, **kwargs)
return wrapper
开始使用装饰器提升你的Python代码!
装饰器是Python高级编程的核心技术之一。掌握它们可以让你写出更简洁、更强大、更易于维护的代码。
#PythonDecorators
本文由DiaoZe于2025-07-16发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20255766.html
发表评论