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

Python装饰器函数:让你的函数更加优雅

发布时间:2023-07-04 22:03:04

Python装饰器是一种可以在不修改原函数代码的情况下,给函数增加额外功能的方法。装饰器函数接受一个函数作为输入,返回一个新的函数作为输出,这个新的函数包含了原函数的功能,并且增加了一些额外的处理。

装饰器函数可以实现很多有用的功能,比如日志记录、性能分析、缓存等。它们可以让代码更加优雅、可读性更高,同时也可以提高代码的复用性和可维护性。

下面我们来看一个简单的装饰器函数的例子:

def log_func(func):
    def wrapper(*args, **kwargs):
        print(f'Calling function {func.__name__}')
        result = func(*args, **kwargs)
        print(f'Function {func.__name__} finished')
        return result
    return wrapper

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

result = add(1, 2)
print(result)

在上面的例子中,我们定义了一个装饰器函数log_func,它接受一个函数func作为输入。装饰器函数内部定义了一个新的函数wrapper,它接受任意数量的位置参数和关键字参数,并且在调用原函数之前打印一条日志,在调用原函数之后再打印一条日志。最后,装饰器函数返回这个新的函数wrapper

在使用这个装饰器函数的时候,我们使用@log_func的语法将它应用到原函数add上。这样我们就得到了一个新的函数add,它具有了原函数的功能,同时还增加了日志打印的额外功能。我们可以像调用原函数一样调用这个新的函数,并且会看到相应的日志输出。

装饰器函数的用法非常灵活,可以根据需求来定义不同功能的装饰器。下面是一些常见的装饰器的例子:

- 计时器装饰器:用于计算函数的运行时间。

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f'{func.__name__} took {end_time - start_time} seconds to run')
        return result
    return wrapper

@timer
def long_running_task():
    time.sleep(5)

long_running_task()

- 状态缓存装饰器:用于缓存函数的结果,避免重复计算。

def memoize(func):
    cache = {}
    def wrapper(*args, **kwargs):
        key = str(args) + str(kwargs)
        if key in cache:
            return cache[key]
        result = func(*args, **kwargs)
        cache[key] = result
        return result
    return wrapper

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

print(fibonacci(10))

以上只是装饰器的一些基本用法示例,实际中可以根据具体需求来组合和定制装饰器函数,以实现更加灵活和强大的功能。装饰器函数的设计思想可以很好地体现Python的函数式编程特性,给我们的代码带来了很多便利和优雅。