深度解析Python装饰器常见用法与进阶技巧

Written by

in

文章目录
  • 装饰器本质上是一个高阶函数,即:以函数为参数并返回新函数的函数。它可以在不修改原始函数代码的前提下,动态地为其添加功能。 def my_decorator(func): def wrapper(*args, **kwargs): print(‘Before function call’) result = func(*args, **kwargs) print(‘After function call’) return result return wrapper @my_decorator def say_hello(): print(‘Hello, world!’) say_hello() 输出: Before function callHello, world!After function call
  • 1.日志记录 import logging def log_decorator(func): def wrapper(*args, **kwargs): logging.info(f’Calling {func.__name__}’) return func(*args, **kwargs) return wrapper 2.权限校验 def require_admin(func): def wrapper(user, *args, **kwargs): if not user.is_admin: raise PermissionError(‘Admin required’) return func(user, *args, **kwargs) return wrapper 3.性能分析 import time def timeit(func): def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f'{func.__name__} took {end – start:.4f}s’) return result return wrapper 4.缓存机制 from functools import lru_cache @lru_cache(maxsize=128) def fib(n): return n if n < 2 else fib(n-1) + fib(n-2)
  • 带参数的装饰器需要再包一层函数: def repeat(times): def decorator(func): def wrapper(*args, **kwargs): for _ in range(times): result = func(*args, **kwargs) return result return wrapper return decorator @repeat(3) def greet(): print(‘Hello!’)
  • 类装饰器 可以用于增强类的功能: def singleton(cls): instances = {} def get_instance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return get_instance @singleton class Database: pass 方法装饰器 与函数装饰器类似,但要注意 self 的传递: def method_logger(func): def wrapper(self, *args, **kwargs): print(f’Calling {func.__name__} of {self}’) return func(self, *args, **kwargs) return wrapper class MyClass: @method_logger def foo(self): print(‘foo called’)
  • 多个装饰器可以叠加使用,执行顺序为自下而上: @decorator_a @decorator_b def func(): pass # 等价于 func = decorator_a(decorator_b(func))
  • 装饰器会改变被装饰函数的元信息(如__name__, __doc__),推荐用 functools.wraps 保留原信息: from functools import wraps def my_decorator(func): @wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper 对于类型提示,可以直接在装饰器和被装饰函数中添加 type hints。
  • 始终使用 functools.wraps 保留函数元信息 为装饰器编写单元测试,确保功能可复用且无副作用 合理使用装饰器,避免过度嵌套导致调试困难 利用标准库装饰器(如 @staticmethod, @classmethod, @property, @lru_cache)提升开发效率 为装饰器添加类型提示和文档字符串
  • Python 装饰器让我们以声明式、可复用的方式增强函数和类的行为。掌握装饰器的原理与用法,不仅能提升代码的可读性和复用性,更能让你的 Python 项目更具专业水准。建议在实际开发中多加练习,灵活运用装饰器解决实际问题。 到此这篇关于深度解析Python装饰器常见用法与进阶技巧的文章就介绍到这了,更多相关Python装饰器内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python装饰器之类装饰器详解 python 装饰器带参数和不带参数步骤详解 详解Python如何利用装饰器实现重试机制 Python中的各种装饰器解析 python必学知识之装饰器详解 Python中的装饰器类详解 python装饰器简介及同时使用多个装饰器的方法
  • 目录
    • 装饰器的基本原理
    • 函数装饰器的常见用法
    • 带参数的装饰器
    • 类装饰器与方法装饰器
    • 装饰器的嵌套与组合
    • 进阶技巧:保留元信息与类型提示
    • 装饰器最佳实践
    • 总结

    装饰器本质上是一个高阶函数,即:以函数为参数并返回新函数的函数。它可以在不修改原始函数代码的前提下,动态地为其添加功能。

    def my_decorator(func):
        def wrapper(*args, **kwargs):
            print('Before function call')
            result = func(*args, **kwargs)
            print('After function call')
            return result
        return wrapper
    
    @my_decorator
    def say_hello():
        print('Hello, world!')
    
    say_hello()
    

    输出:

    Before function call
    Hello, world!
    After function call

    1.日志记录

    import logging
    
    def log_decorator(func):
        def wrapper(*args, **kwargs):
            logging.info(f'Calling {func.__name__}')
            return func(*args, **kwargs)
        return wrapper
    

    2.权限校验

    def require_admin(func):
        def wrapper(user, *args, **kwargs):
            if not user.is_admin:
                raise PermissionError('Admin required')
            return func(user, *args, **kwargs)
        return wrapper
    

    3.性能分析

    import time
    
    def timeit(func):
        def wrapper(*args, **kwargs):
            start = time.time()
            result = func(*args, **kwargs)
            end = time.time()
            print(f'{func.__name__} took {end - start:.4f}s')
            return result
        return wrapper
    

    4.缓存机制

    from functools import lru_cache
    
    @lru_cache(maxsize=128)
    def fib(n):
        return n if n < 2 else fib(n-1) + fib(n-2)
    

    带参数的装饰器需要再包一层函数:

    def repeat(times):
        def decorator(func):
            def wrapper(*args, **kwargs):
                for _ in range(times):
                    result = func(*args, **kwargs)
                return result
            return wrapper
        return decorator
    
    @repeat(3)
    def greet():
        print('Hello!')
    

    类装饰器

    可以用于增强类的功能:

    def singleton(cls):
        instances = {}
        def get_instance(*args, **kwargs):
            if cls not in instances:
                instances[cls] = cls(*args, **kwargs)
            return instances[cls]
        return get_instance
    
    @singleton
    class Database:
        pass
    

    方法装饰器

    与函数装饰器类似,但要注意 self 的传递:

    def method_logger(func):
        def wrapper(self, *args, **kwargs):
            print(f'Calling {func.__name__} of {self}')
            return func(self, *args, **kwargs)
        return wrapper
    
    class MyClass:
        @method_logger
        def foo(self):
            print('foo called')
    

    多个装饰器可以叠加使用,执行顺序为自下而上:

    @decorator_a
    @decorator_b
    def func():
        pass
    # 等价于 func = decorator_a(decorator_b(func))
    

    装饰器会改变被装饰函数的元信息(如__name__, __doc__),推荐用 functools.wraps 保留原信息:

    from functools import wraps
    
    def my_decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            return func(*args, **kwargs)
        return wrapper
    

    对于类型提示,可以直接在装饰器和被装饰函数中添加 type hints。

    • 始终使用 functools.wraps 保留函数元信息
    • 为装饰器编写单元测试,确保功能可复用且无副作用
    • 合理使用装饰器,避免过度嵌套导致调试困难
    • 利用标准库装饰器(如 @staticmethod, @classmethod, @property, @lru_cache)提升开发效率
    • 为装饰器添加类型提示和文档字符串

    Python 装饰器让我们以声明式、可复用的方式增强函数和类的行为。掌握装饰器的原理与用法,不仅能提升代码的可读性和复用性,更能让你的 Python 项目更具专业水准。建议在实际开发中多加练习,灵活运用装饰器解决实际问题。

    到此这篇关于深度解析Python装饰器常见用法与进阶技巧的文章就介绍到这了,更多相关Python装饰器内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Python装饰器之类装饰器详解
    • python 装饰器带参数和不带参数步骤详解
    • 详解Python如何利用装饰器实现重试机制
    • Python中的各种装饰器解析
    • python必学知识之装饰器详解
    • Python中的装饰器类详解
    • python装饰器简介及同时使用多个装饰器的方法

    站内搜索