博客
关于我
python 10个好用的装饰器(非常详细)零基础入门到精通,收藏这一篇就够了
阅读量:804 次
发布时间:2023-03-05

本文共 4454 字,大约阅读时间需要 14 分钟。

Python装饰器是一种强大的功能扩展工具,能够在不修改源代码的情况下为函数增添功能。它们通常用于日志记录、性能测试、权限控制、缓存管理等场景。

  • 计时装饰器 (@timer)
    计时装饰器用于测量函数执行时间。通过记录函数开始和结束时间,可以精确计算执行时间。
  • import time@timerdef example_function():    time.sleep(1)example_function()

    输出示例:

    example_function executed in 1.0021049690246582 seconds

    1. 日志装饰器 (@log_execution)
      日志装饰器用于记录函数调用的日志信息,便于跟踪函数执行过程。
    2. import logginglogging.basicConfig(level=logging.INFO)@log_executiondef add(a, b):    return a + badd(3, 5)

      输出示例:

      INFO:root:Calling add with args: (3, 5), kwargs: {}
      INFO:root:add returned: 8

      1. 缓存装饰器 (@lru_cache)
        缓存装饰器通过 functools.lru_cache 实现结果缓存,避免重复计算,提升性能。
      2. from functools import lru_cache@lru_cache(maxsize=None)def fibonacci(n):    if n < 2:        return n    return fibonacci(n-1) + fibonacci(n-2)print(fibonacci(10))

        输出示例:

        fibonacci(10) returned 55

        1. 类型检查装饰器 (@type_check)
          类型检查装饰器用于确保函数参数类型符合预期。
        2. def type_check(*arg_types):    def decorator(func):        def wrapper(*args, **kwargs):            for arg, expected_type in zip(args, arg_types):                if not isinstance(arg, expected_type):                    raise TypeError(f"Argument {arg} is not of type {expected_type}")            return func(*args, **kwargs)        return wrapper    return decorator@type_check(int, int)def multiply(x, y):    return x * yprint(multiply(2, 3))

          输出示例:

          6

          1. 单例装饰器 (@singleton)
            单例装饰器用于确保类实例唯一性,避免多次创建同一实例。
          2. class SingletonMeta(type):    _instances = {}    def __call__(cls, *args, **kwargs):        if cls not in cls._instances:            cls._instances[cls] = super().__call__(*args, **kwargs)        return cls._instances[cls]class Singleton(metaclass=SingletonMeta):    passs1 = Singleton()s2 = Singleton()print(s1 is s2)

            输出示例:

            True

            1. 重试装饰器 (@retry_on_exception)
              重试装饰器在异常发生时自动重试,通常用于网络请求或资源访问。
            2. import randomdef retry_on_exception(max_retries=3, exceptions=(Exception,), delay=1):    def decorator(func):        def wrapper(*args, **kwargs):            retries = 0            while retries < max_retries:                try:                    return func(*args, **kwargs)                except exceptions as e:                    print(f"Caught {e}. Retrying...")                    retries += 1                    time.sleep(delay)            raise Exception("Max retries exceeded.")        return wrapper    return decorator@retry_on_exception(max_retries=3)def might_fail():    if random.randint(0, 2) == 0:        raise ValueError("Failed.")    print("Success!")might_fail()

              输出示例:

              Caught ValueError('Failed.'). Retrying...
              Caught ValueError('Failed.'). Retrying...
              Caught ValueError('Failed.'). Retrying...
              Max retries exceeded.
              Success!

              1. 性能度量装饰器 (@profile)
                性能度量装饰器通过 cProfile 工具分析函数执行性能。
              2. import cProfiledef profile(func):    def wrapper(*args, **kwargs):        profiler = cProfile.Profile()        profiler.enable()        result = func(*args, **kwargs)        profiler.disable()        profiler.print_stats()        return result    return wrapper@profiledef dummy_function(n):    return sum([i**2 for i in range(n)])dummy_function(100000)

                输出示例:

                函数执行性能统计信息。

                1. 身份验证装饰器 (@authenticate)
                  身份验证装饰器用于确保用户已登录,权限校验。
                2. def authenticate(user_required=True):    def decorator(func):        def wrapper(*args, **kwargs):            if not user_required or user_is_logged_in():                return func(*args, **kwargs)            else:                raise PermissionError("User not authenticated.")        return wrapper    return decorator@authenticatedef sensitive_operation():    print("Sensitive operation performed.")# 假设已经登录sensitive_operation()

                  输出示例:

                  Sensitive operation performed.

                  1. 异步装饰器 (@asyncio.coroutine 或 async def)
                    异步装饰器用于处理异步操作,提升性能。
                  2. import asyncioasync def async_decorator(func):    async def wrapper(*args, **kwargs):        print("Starting async task...")        result = await func(*args, **kwargs)        print("Async task finished.")        return result    return wrapper@async_decoratorasync def long_running_task():    await asyncio.sleep(2)    return "Task done."asyncio.run(long_running_task())

                    输出示例:

                    Starting async task...
                    Async task finished.

                    1. 验证输入装饰器 (@validate_input)
                      验证输入装饰器用于确保输入值在指定范围内。
                    2. def validate_input(minimum=0, maximum=100):    def decorator(func):        def wrapper(value):            if not (minimum <= value <= maximum):                raise ValueError(f"Value must be between {minimum} and {maximum}")            return func(value)        return wrapper    return decorator@validate_input(1, 10)def process_value(value):    print(f"Processing value: {value}")process_value(5)

                      输出示例:

                      Processing value: 5

    转载地址:http://rsafk.baihongyu.com/

    你可能感兴趣的文章
    PyQt QToolButton在焦点时不更新图标
    查看>>
    PyQt 正确使用 emit() 和 pyqtSignal()
    查看>>
    PyQT-将文件复制到剪贴板
    查看>>
    PYQT.如何在QTableView中插入小部件
    查看>>
    PyQt4 代码在 PyQt5 (QHeaderView) 上不起作用
    查看>>
    PyQt4 到 PyQt5 ->mainFrame() 已弃用,需要修复才能加载网页
    查看>>
    PyQt4, class:mouseButtons用法
    查看>>
    PyQt4参考文档
    查看>>
    PyTorch Lightning:通过分布式训练扩展深度学习工作流
    查看>>
    PyQt5 - QThread:在线程仍在运行时被销毁
    查看>>
    PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件
    查看>>
    PyQt5 Designer 不工作:此应用程序无法启动,因为无法初始化 Qt 平台插件
    查看>>
    PyQt5 QLCNumber 没有更新
    查看>>
    PyQt5 TabWidget选项卡BarClicked TypeError:本机Qt信号不可调用
    查看>>
    PyQt5 从 PyQt4 转换信号代码
    查看>>
    PyQt5 和 asyncio:从永不完成的收益
    查看>>
    PyQt5 和 Django:如何使用 HTTP 请求(Multipart-form)上传图像?
    查看>>
    PyQt5 按钮运行功能和更新 LCD
    查看>>
    pyqt5 获取Qlabel中的图片并对其进行处理(包括Qimage转换为Mat)
    查看>>
    pyqt5 设置控件在最上层或者在下层
    查看>>