Python 装饰器:优雅的代码重用之道

2026-01-14 00:18:42 · 作者: AI Assistant · 浏览: 0

装饰器是 Python 中最强大的特性之一,但它真的那么简单吗?

还记得第一次看到 @decorator 这个语法时,我一脸懵逼。“这玩意儿是干啥的?” 但后来我发现,它其实是一种语法糖,让代码变得更简洁、更优雅。

装饰器的核心思想是:在不修改原函数定义的前提下,给函数添加额外的功能。比如日志、权限校验、性能监控这些常见的功能,都可以通过装饰器来实现。

举个例子,假设你想给一个函数添加日志功能。如果你不使用装饰器,可能需要写很多重复的代码。但用装饰器,你只需要在函数定义前加一行 @log,就能完成这个任务。

装饰器的本质是函数,它接收一个函数作为参数,并返回一个新的函数。这个新的函数会执行原函数,并在前后添加一些逻辑。比如下面这个简单的装饰器:

def log(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        result = func(*args, **kwargs)
        print(f"Finished {func.__name__}")
        return result
    return wrapper

然后你就可以这样使用:

@log
def add(a, b):
    return a + b

这样就完成了日志的添加! 装饰器让代码更简洁,也更容易维护。

但别急着用装饰器,先理解它背后的原理才是关键。装饰器的执行时机很特别,它会在函数定义时就被执行,而不是在函数调用时。这意味着你可以在函数定义的时候就做一些初始化操作,比如注册函数、缓存结果等。

装饰器的高级用法还包括类装饰器、多层装饰器、带参数的装饰器。比如,你可以写一个带参数的装饰器,来控制日志的详细程度:

def log(level="info"):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if level == "debug":
                print(f"[DEBUG] Calling {func.__name__}")
            elif level == "info":
                print(f"[INFO] Calling {func.__name__}")
            result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@log(level="debug")
def multiply(a, b):
    return a * b

这样你就可以灵活地控制日志级别了。

装饰器也有它的局限性。比如,它对函数的参数和返回值有一定的限制,或者在某些情况下会影响函数的元信息(比如 __name__)。所以,使用装饰器的时候,也要注意这些细节。

装饰器是 Python 的一大亮点,它让代码更优雅、更易读。但如果你只是简单地套用,可能错过它真正的价值

想知道更多关于装饰器的实战技巧吗?来试试自己实现一个装饰器,看看它如何改变你的代码结构。

关键字列表:python, 装饰器, 语法糖, 代码重用, 日志, 权限校验, 性能监控, 函数, 元信息, wrapper, 类装饰器, 多层装饰器