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

Python装饰器函数:如何优雅地增强函数功能

发布时间:2023-06-17 04:43:03

Python装饰器是一种语法糖,可以使开发者优雅地增强函数功能。装饰器函数是一种高阶函数,它接受一个函数作为参数,并返回一个新函数,新函数包装了原始函数,使得原始函数的功能得到增强。

Python装饰器的语法如下:

@decorator
def function():
    pass

其中“decorator”是装饰器函数,它接受一个函数作为参数,并返回一个新函数。在装饰器函数之前加上“@”符号,就可以将装饰器函数应用到原始函数上。

下面我们来看一些常见的装饰器实例:

1. 计时器装饰器

计时器装饰器可以测量函数执行的时间。实现这个装饰器函数需要先导入time模块,然后使用time.time()来获取时间戳:

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__}运行时间:{end_time-start_time:.4f}s")
        return result
    return wrapper

在这个装饰器函数中,我们定义了一个新函数wrapper(),它接受任意个位置参数和关键字参数,并使用time.time()测量函数执行时间。最后,我们将新函数wrapper()返回,这样原始函数的执行时间就可以被测量了。

使用这个装饰器函数,我们可以轻松地测量任何函数的执行时间:

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

my_func()

2. 日志装饰器

日志装饰器可以将函数执行的结果记录到日志文件中。实现这个装饰器函数需要先导入logging模块,然后使用logging.basicConfig()来配置日志文件:

import logging

logging.basicConfig(filename='log.txt', level=logging.INFO)

def log_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        logging.info(f"{func.__name__}结果:{result}")
        return result
    return wrapper

在这个装饰器函数中,我们定义了一个新函数wrapper(),它接受任意个位置参数和关键字参数,并将函数的执行结果写入日志文件。最后,我们将新函数wrapper()返回,这样原始函数的结果就可以被记录到日志文件中了。

使用这个装饰器函数,我们可以轻松地记录任何函数的执行结果:

@log_decorator
def my_func():
    return "Hello, World!"

my_func()

3. 缓存装饰器

缓存装饰器可以使函数返回值被缓存起来,避免重复执行。实现这个装饰器函数需要先定义一个全局变量来存储函数返回值:

cache = {}

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

在这个装饰器函数中,我们定义了一个全局变量cache,它存储了函数的返回值。然后我们定义了一个新函数wrapper(),它接受任意个位置参数和关键字参数,并检查缓存中是否已经存在这个函数的结果。如果函数结果已经在缓存中,则直接返回缓存中的结果,否则执行原始函数,并将结果存入缓存中。最后,我们将新函数wrapper()返回。

使用这个装饰器函数,我们可以轻松地实现函数结果的缓存:

@cache_decorator
def my_func(n):
    return n * 2

print(my_func(3))
print(my_func(3))

除了上述实例,还有很多其他装饰器函数可以实现不同的功能,如认证、授权、并发、重试等。开发者可以根据需求自行编写装饰器函数,以优雅地增强函数功能。