Decorator修饰器是Python语言中一种特殊的语法结构,用于在函数或类的定义前使用@符号,通过对原有函数或类进行包装,为其添加额外的功能或修改其行为。修饰器的作用类似于在被修饰的函数或类周围添加一个概念上的包装层,以实现代码的可重用性和可扩展性。下面将从三个方面来说明Decorator修饰器的作用。

1. 代码复用与封装
Decorator修饰器可以将常用的功能模块封装成单独的修饰器函数,减少代码的重复编写,提高代码的复用性。例如,可以使用一个日志记录的修饰器函数来装饰多个函数,使得这些函数在执行前后都会记录日志,而无需在每个函数中都编写相同的日志记录代码。

<pre class="line-numbers language-python"><code class="language-python"><span aria-hidden="true" class="line-numbers-rows"><span></span></span>
def log_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before calling function: ", func.__name__)
        result = func(*args, **kwargs)
        print("After calling function: ", func.__name__)
        return result
    return wrapper

@log_decorator
def add(a, b):
    return a + b

@log_decorator
def subtract(a, b):
    return a - b

print(add(2, 3))        # 输出: Before calling function:  add
                        #       After calling function:  add
                        #       5
print(subtract(5, 2))   # 输出: Before calling function:  subtract
                        #       After calling function:  subtract
                        #       3
</code></pre>

2. 动态修改函数或类的行为
Decorator修饰器可以在不修改原始函数或类的定义的情况下,通过包装原始函数和类的方式,动态地修改其行为。修饰器可以在原始函数或类的执行前后执行其他代码,或者在原始函数或类的执行过程中传入额外的参数,等等。

<pre class="line-numbers language-python"><code class="language-python"><span aria-hidden="true" class="line-numbers-rows"><span></span></span>
def runtime_calculator(func):
    import time

    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        runtime = end_time - start_time
        print("Runtime of function {}: {} seconds.".format(func.__name__, runtime))
        return result
    return wrapper

@runtime_calculator
def multiply(a, b):
    time.sleep(1)
    return a * b

print(multiply(2, 3))   # 输出: Runtime of function multiply: 1.0002338886260986 seconds.
                        #       6
</code></pre>

3. 扩展已有函数或类的功能
Decorator修饰器可以为已有函数或类添加新的功能,而不需要修改原有的函数或类的定义。修饰器在不改变原有代码的基础上,通过包装原始函数或类的方式,为其添加新的功能或修改其行为。这种方式在不破坏已有代码的前提下,实现了代码的扩展和修改。

<pre class="line-numbers language-python"><code class="language-python"><span aria-hidden="true" class="line-numbers-rows"><span></span></span>
def cache_decorator(func):
    cache = {}

    def wrapper(*args):
        key = args
        if key in cache:
            print("Fetch result from cache.")
            return cache[key]
        else:
            result = func(*args)
            cache[key] = result
            return result
    return wrapper

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

print(fibonacci(10))    # 输出: 55
print(fibonacci(20))    # 输出: 6765
print(fibonacci(10))    # 输出: Fetch result from cache.
                        #       55
</code></pre>

综上所述,Decorator修饰器在Python中的作用包括代码复用与封装、动态修改函数或类的行为,以及扩展已有函数或类的功能。通过使用Decorator修饰器,可以提高代码的可读性、可扩展性和可重用性,同时使代码更加简洁、优雅和易于维护。