Python 中的装饰器是一种非常强大的功能,可以用来修改函数的行为而不改变其源代码。装饰器本质上是一个接收函数作为参数的函数,并返回一个新的函数。下面是 Python 中常见的几种装饰器及其用途:
1. @classmethod
类方法装饰器将一个类方法标记为类方法。类方法的第一个参数是 `cls`,代表类本身,而不是实例对象。
class MyClass:
def my_class_method(cls, arg):
pass
2. @staticmethod
静态方法装饰器使得方法不依赖于类的状态。静态方法不需要 `self` 或 `cls` 参数。
class MyClass:
def my_static_method(arg):
pass
3. @property
属性装饰器允许你将方法作为属性来访问,而不是像通常那样用括号调用。
class MyClass:
@property
def my_property(self):
return self._my_property
@my_property.setter
def my_property(self, value):
self._my_property = value
4. @functools.lru_cache
使用标准库中的 `functools.lru_cache` 装饰器可以实现缓存函数的结果,以提高性能。
import functools
def expensive_function(arg):
# 缓存计算结果
pass
5. @functools.wraps
这个装饰器用来保持被装饰函数的元数据,如函数名、文档字符串等。
import functools
def my_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result
return wrapper
6. @timeit
自定义装饰器,用于测量函数执行的时间。
import time
def timeit(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Function {func.__name__} took {end_time - start_time:.4f}s to execute.")
return result
return wrapper
def some_function():
pass
7. @debug
自定义装饰器,用于打印调试信息。
def debug(func):
def wrapper(*args, **kwargs):
print(f"Calling function {func.__name__}")
result = func(*args, **kwargs)
print(f"Function {func.__name__} returned {result}")
return result
return wrapper
def some_function():
pass
8. @retry
自定义装饰器,用于自动重试失败的操作。
def retry(max_attempts=3):
def decorator(func):
def wrapper(*args, **kwargs):
for attempt in range(max_attempts):
try:
return func(*args, **kwargs)
except Exception as e:
if attempt == max_attempts - 1:
raise e
else:
ontinue
return wrapper
return decorator
def some_function():
pass
9. @transaction.atomic
如果你在使用 Django 框架处理数据库事务,这个装饰器可以用来保证事务的一致性。
from django.db import transaction
def some_function():
pass
10. @login_required
在 Web 开发框架如 Django 中,这个装饰器用来限制只有登录用户才能访问某些视图。
from django.contrib.auth.decorators import login_required
def some_view(request):
pass
这些装饰器展示了 Python 的灵活性和可扩展性。根据具体需求,你可以选择合适的装饰器,或者创建自己的装饰器来满足特定的功能需求。