Python中的装饰器一网打尽,让你的代码更优美! 在Python中,装饰器是一种很有用的语法,它可以在不改变函数结构的情况下,增加函数的功能,可以帮助我们更好地重用代码和实现横切面的功能。 什么是装饰器? 装饰器是一种特殊的函数,它接收一个函数(被装饰的函数)作为参数,并返回一个新的函数。这个新函数通常会在原函数的基础上添加一些额外的功能,并返回原函数的结果,从而提供了一种增强函数的方法。 装饰器的语法如下: ``` @decorator_function def my_function(): pass ``` 其中,`decorator_function`是装饰器函数,`my_function`是需要被装饰的函数。 示例代码: ```python def my_decorator_func(func): def wrapper(): print(f'Log: calling function {func.__name__}') func() return wrapper @my_decorator_func def my_function(): print('Hello, World!') my_function() ``` 运行结果: ``` Log: calling function my_function Hello, World! ``` 在上面的示例中,我们定义了一个装饰器函数`my_decorator_func`,它接收一个函数作为参数,并返回一个新的函数`wrapper`,这个新函数添加了一些额外的功能。然后,我们通过在`my_function`函数上添加`@my_decorator_function`装饰器,来调用`my_decorator_function`并将`my_function`作为参数传递给它。 当我们调用`my_function()`时,会先执行装饰器函数`wrapper`中的代码(即打印日志信息),然后再执行原函数`my_function`的代码。这样,我们就成功地在不改变原函数结构的情况下,增加了一些额外功能。 常见的装饰器: 1. 计时装饰器 计时装饰器可以用来计算函数的执行时间,它可以帮助我们找到代码中的瓶颈。 示例代码: ```python import time def timer(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f'Function {func.__name__} executed in {end_time - start_time:.2f} seconds') return result return wrapper @timer def my_function(n): time.sleep(n) my_function(2) ``` 运行结果: ``` Function my_function executed in 2.00 seconds ``` 在上面的代码中,我们定义了一个计时装饰器`timer`,它接收一个函数作为参数,并返回一个新的函数`wrapper`,这个新函数会计算原函数的执行时间,并打印日志信息。然后,我们使用`@timer`装饰器来装饰`my_function`函数,即可实现计时功能。 2. 缓存装饰器 缓存装饰器可以用来缓存函数的结果,避免函数重复计算,提高代码的执行效率。 示例代码: ```python def cache(func): cached_results = {} def wrapper(*args): if args in cached_results: result = cached_results[args] else: result = func(*args) cached_results[args] = result return result return wrapper @cache def fibonacci(n): if n < 2: return n else: return fibonacci(n-1) + fibonacci(n-2) print(fibonacci(20)) ``` 运行结果: ``` 6765 ``` 在上面的代码中,我们定义了一个缓存装饰器`cache`,它接收一个函数作为参数,并返回一个新的函数`wrapper`,这个新函数会检查缓存中是否已经存在这个函数的结果,如果存在,就直接返回结果,否则再去计算函数的结果,并将结果存入缓存中。 然后,我们使用`@cache`装饰器来装饰`fibonacci`函数,即可实现缓存功能。 总结: 通过装饰器,我们可以轻松地增加函数的功能,例如计时、缓存、日志等。装饰器可以使我们写出更简洁、优美、易读的代码,提高代码的可维护性和可重用性。希望本文能够帮助大家更好地理解Python中的装饰器,并且能够在实际项目中应用起来。