神奇的Python装饰器:让你的代码更简洁高效 在Python中,装饰器是一种可以修改函数或类行为的高级技术。装饰器实际上是一个函数,它接受原始函数作为参数,并返回一个新函数。 装饰器的语法非常简单,可以在函数定义之前使用@符号来应用装饰器。例如,下面的代码定义了一个装饰器,它打印函数名称和参数: ```python def log_calls(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__} with args {args} and kwargs {kwargs}") return func(*args, **kwargs) return wrapper @log_calls def my_func(a, b): return a + b ``` 在这个例子中,装饰器函数log_calls接受一个参数func,它是要被装饰的函数。装饰器函数定义了一个名为wrapper的内部函数,它包装了原始函数并添加了一些额外的行为。在这种情况下,wrapper函数会打印原始函数的名称以及它被调用时所传递的参数,然后调用原始函数并返回结果。 然后,@log_calls装饰器应用于my_func函数,这意味着my_func函数将被传递给log_calls函数并修改它的行为。现在,每当我们调用my_func时,它将自动打印一条消息,告诉我们它被调用了,以及传递给它的参数: ```python >>> my_func(1, 2) Calling my_func with args (1, 2) and kwargs {} 3 ``` 在这个例子中,我们定义了一个非常简单的装饰器,但实际上装饰器有许多用途。例如,您可以使用装饰器来缓存函数调用的结果,限制函数的调用次数,或者在函数调用时添加验证或授权步骤。 下面是一个使用装饰器缓存函数结果的例子: ```python def memoize(func): cache = {} def wrapper(*args): if args not in cache: cache[args] = func(*args) return cache[args] return wrapper @memoize def fib(n): if n < 2: return n return fib(n-1) + fib(n-2) ``` 在这个例子中,memoize装饰器使用一个字典来缓存函数的结果。如果函数以相同的参数调用,则它将返回缓存的结果,而不是再次计算结果。现在我们可以轻松地计算斐波那契数列中的第50个数字,因为我们已经缓存了之前的结果: ```python >>> fib(50) 12586269025 ``` 使用装饰器可以提高代码的效率和可读性,尤其是当您需要在多个函数之间共享相同的行为时。如果您发现自己编写了大量重复的代码,请考虑使用装饰器来简化和重构您的代码。