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

咨询电话:4000806560

Python之神奇的Decorator用法

Python之神奇的Decorator用法

在Python中,Decorator是一种非常重要的元素。它不仅能够让你的代码更加简洁,更加易读,还能够方便的实现一些拓展功能。

本文将介绍一些Python Decorator的神奇用法,让你在编写代码的时候能够更加轻松、高效地实现某些功能。

1. 基本Decorator用法

首先让我们先了解一下最基础的Decorator用法。在Python中,Decorator可以通过@符号来使用。下面是一个简单的示例:

```
def log(func):
    def wrapper(*args, **kwargs):
        print("call function %s():" % func.__name__)
        return func(*args, **kwargs)
    return wrapper

@log
def example():
    print("Hello, World!")
```

在上面的代码中,log是一个Decorator,它会将example这个函数装饰起来。当我们调用example()函数时,实际上调用的是log()函数的返回值wrapper()函数。

wrapper函数在调用example()函数之前,会先输出一行日志。这样我们就能够在不影响example()函数原本功能的情况下,实现一些拓展功能。

2. 带参数的Decorator用法

除了上面的基础Decorator用法之外,还有一种更为常见的情况:带参数的Decorator用法。下面是一个示例:

```
def repeat(num):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for i in range(num):
                print("call function %s() for the %d time:" % (func.__name__, i+1))
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3)
def example():
    print("Hello, World!")
```

在上面的代码中,我们定义了一个repeat函数,它接收一个num参数。repeat函数返回一个decorator函数,它内部再返回一个wrapper函数。

@repeat(3)实际上等价于@decorator。当我们调用example()函数时,会连续调用3次,每次都输出一行日志。

3. 类Decorator用法

除了函数Decorator之外,Python还支持类Decorator。下面是一个示例:

```
class CallCount:
    def __init__(self, func):
        self.func = func
        self.num_calls = 0

    def __call__(self, *args, **kwargs):
        self.num_calls += 1
        print("function %s() called %d times." % (self.func.__name__, self.num_calls))
        return self.func(*args, **kwargs)

@CallCount
def example():
    print("Hello, World!")
```

在上面的代码中,我们定义了一个CallCount类。它接收一个func参数,它内部定义了__call__()函数。在调用example()函数时,会先调用CallCount类的__call__()函数,然后才是example()函数本身。

当我们调用example()函数多次时,会输出不同的日志,告诉我们example()被调用的次数。

4. 缓存Decorator用法

最后一个Decorator用法是缓存。下面是一个示例:

```
def memoize(func):
    cache = {}

    def wrapper(*args):
        if args in cache:
            return cache[args]
        else:
            result = func(*args)
            cache[args] = result
            return result

    return wrapper

@memoize
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)
```

在上面的代码中,我们定义了一个memoize函数。它接受一个func参数,它内部定义了cache字典和wrapper()函数。当我们调用fibonacci()函数时,实际上调用了memoize()函数返回的wrapper()函数。

wrapper()函数会先判断当前参数是否在cache字典中存在,如果存在则直接返回结果。如果不存在,则调用func()函数计算出结果,存入cache字典中,然后再返回结果。

这样我们就能够避免计算重复的结果,大大提高了函数的执行效率。

总结

Decorator是Python中非常重要的一个元素。它能够让我们在不破坏原有代码结构的情况下,实现一些拓展功能。本文介绍了几种常见的Decorator用法,它们分别是基础Decorator用法、带参数的Decorator用法、类Decorator用法和缓存Decorator用法。

希望本文的内容能够帮助你更加深入地理解Python中Decorator的神奇用法。