博客
关于我
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/

    你可能感兴趣的文章
    protocol学习笔记001---RPC和HTTP协议之间的区别_与各自优势
    查看>>
    protostuff简单应用
    查看>>
    PRover 开源项目教程
    查看>>
    PyTorch-Tutorials【pytorch官方教程中英文详解】- 4 Transforms
    查看>>
    Proxy server 緩存 jsp html
    查看>>
    Proxy 和 Reflect 结合实现代理和拦截( 代码示例 )
    查看>>
    PyTorch-Tutorials【pytorch官方教程中英文详解】- 3 Datasets&DataLoaders
    查看>>
    ProxySQL+MHA搭建MySQL读写分离高可用集群
    查看>>
    Proxy源代码分析--谈谈如何学习linux网络编程
    查看>>
    pr录制自己声音杂音很重
    查看>>
    PyTorch-Tutorials【pytorch官方教程中英文详解】- 2 Tensors
    查看>>
    ps ww
    查看>>
    PS —— 制作喷漆人像
    查看>>
    PS —— 制作证件照
    查看>>
    PS —— 精修图像
    查看>>
    PS 图像调整算法——色调分离
    查看>>
    ps 图层混合模式
    查看>>
    ps2025下载安装教程(附安装包)ps2025超详细安装教程
    查看>>
    PSGSuite 项目推荐
    查看>>
    PSR PHP业界规范
    查看>>