欢迎访问宙启技术站
智能推送

学习Python函数装饰器:提高代码复用性

发布时间:2023-05-28 04:43:36

在Python中,函数装饰器是提高代码复用性的一种强大机制。函数装饰器可以在不修改原始函数代码的情况下增加或修改函数的行为。装饰器是一个可调用对象,它接收一个函数作为输入,并返回一个新的函数作为输出。通过这种方式,函数装饰器可以在运行时修改函数的行为,而不需要修改原始函数的代码。

使用装饰器可以提高代码的可读性和重用性,并减少代码冗余。下面是一些常见的装饰器用例:

1. 计时器

计时装饰器可以在运行程序时测量函数执行时间。这在优化程序性能时非常有用。下面是一个计时器装饰器的示例:

import time

def time_it(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print('Elapsed time:', end - start)
        return result
    return wrapper

@time_it
def test_function():
    time.sleep(2)
    
test_function()

这个装饰器会测量test_function运行的时间,并在程序结束时打印出来。

2. 缓存器

缓存装饰器可以缓存函数的输出,以避免重复计算。这对于计算成本高昂的函数尤其有用。下面是一个缓存器装饰器的示例:

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

@cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))

这个装饰器会缓存fibonacci函数的输出。当输入相同的参数时,它会返回缓存的结果而不是重新计算。

3. 输入验证

输入验证装饰器可以检查函数的输入是否满足条件。这可以避免错误的输入导致程序崩溃。下面是一个输入验证装饰器的示例:

def validate_input(func):
    def wrapper(arg):
        if type(arg) != int or arg < 0:
            raise ValueError('Input must be a non-negative integer')
        return func(arg)
    return wrapper

@validate_input
def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n-1)

print(factorial(5))

这个装饰器检查factorial函数的输入是否为正整数。如果不是,则会引发一个错误。

结论

函数装饰器是提高代码复用性的一种重要机制。它们可以增强函数的行为,并减少重复的代码。Python中有许多常见的装饰器,包括计时器、缓存器和输入验证器。使用装饰器可以让代码更易于理解和维护。