十个常见的Python装饰器

学术   2024-09-19 11:11   广东  

    Python 中的装饰器是一种非常强大的功能,可以用来修改函数的行为而不改变其源代码。装饰器本质上是一个接收函数作为参数的函数,并返回一个新的函数。下面是 Python 中常见的几种装饰器及其用途:


1. @classmethod

    类方法装饰器将一个类方法标记为类方法。类方法的第一个参数是 `cls`,代表类本身,而不是实例对象。

class MyClass:  @classmethod  def my_class_method(cls, arg):    pass

2. @staticmethod

    静态方法装饰器使得方法不依赖于类的状态。静态方法不需要 `self` 或 `cls` 参数。

class MyClass:  @staticmethod  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     @functools.lru_cache(maxsize=None)  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   @timeitdef 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   @debugdef 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   @retry(max_attempts=3)def some_function():  pass

9. @transaction.atomic

    如果你在使用 Django 框架处理数据库事务,这个装饰器可以用来保证事务的一致性。

from django.db import transaction   @transaction.atomicdef some_function():  pass

10. @login_required

    在 Web 开发框架如 Django 中,这个装饰器用来限制只有登录用户才能访问某些视图。

from django.contrib.auth.decorators import login_required @login_requireddef some_view(request):    pass

    这些装饰器展示了 Python 的灵活性和可扩展性。根据具体需求,你可以选择合适的装饰器,或者创建自己的装饰器来满足特定的功能需求。

控制工程研习
好好学习,天天向上
 最新文章