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中的装饰器,并且能够在实际项目中应用起来。