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

自定义Python装饰器函数实现代码重用

发布时间:2023-05-21 06:57:46

装饰器是Python语言中的一个重要的特性,它可以用来修改、增强或者替换函数或类的功能,可以大大提高代码重用性。我们可以通过定义装饰器函数来实现代码的重用。

自定义Python装饰器函数的基本模板如下:

def decorator(func):
    def wrapper(*args, **kwargs):
        # do something
        return func(*args, **kwargs)
    return wrapper

@decorator
def func():
    pass

上面的代码中,decorator是自定义的装饰器函数,它使用了Python的闭包特性,实现了对被装饰函数的包裹,并且在被装饰函数执行之前或之后执行一些操作。wrapper函数是闭包函数,它可以访问到外部函数的变量和参数,并且可以传递任意参数和关键字参数到被包裹函数func中。

装饰器可以接受任意数量和类型的参数,包括函数和其他对象。我们可以使用这些参数来自定义装饰器的功能。下面是一些示例:

1. 带参数的装饰器

def repeat(n):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for i in range(n):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3)
def say_hello():
    print("Hello")

say_hello() # 输出 Hello 三次

在这个例子中,我们定义了一个repeat装饰器函数,它接受一个整数参数n,用来指定要重复执行的次数。decorator函数是闭包函数,它接受被装饰的函数作为参数。wrapper函数是闭包函数,它在被包裹函数执行之前或之后执行一些操作。在say_hello函数上方使用@repeat(3)装饰器,这意味着我们将say_hello函数传递给repeat装饰器,并传递一个整数参数3。最终的输出是 Hello 三次。

2. 统计函数执行时间的装饰器

import time

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

@timer
def my_func():
    time.sleep(1)

my_func() # 输出 Elapsed time: 1.0006859302520752

在这个例子中,我们定义了一个timer装饰器函数,它用来统计被装饰函数的执行时间。在被装饰的函数my_func上方使用@timer装饰器,这意味着我们将my_func函数传递给timer装饰器,并在执行my_func函数后输出执行时间。

3. 缓存装饰器

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

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

print(factorial(5)) # 输出 120
print(factorial(6)) # 输出 720
print(factorial(5)) # 输出 120,从缓存中获取

在这个例子中,我们定义了一个cache装饰器函数,它用来缓存被装饰函数的结果。在被装饰的函数factorial上方使用@cache装饰器,这意味着我们将factorial函数传递给cache装饰器,并用缓存来加速函数的执行。

Python装饰器函数可以帮助我们实现代码的重用,可以处理很多复杂的问题,如缓存、日志记录、参数检查等等。通过自定义装饰器函数,我们可以大大提高代码的重用性和可维护性,减少代码的重复和冗余。