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的神奇用法。