匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

Python中的装饰器一网打尽,让你的代码更优美!

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