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

装饰器-函数的增强

发布时间:2023-11-01 12:24:21

装饰器是 Python 中非常强大的功能,可以通过装饰器来增强函数的功能。在函数的定义之前使用 @ 符号来调用装饰器,装饰器类似于一个包装器,它将包装的函数进行修改或者增强,然后将修改后的函数返回。

装饰器可以给函数提供额外的功能,比如:日志记录、性能测试、输入验证等等。当我们想要给多个函数添加相同的功能时,可以使用装饰器来实现,可以简化代码,提高代码的复用性和可维护性。

一个简单的装饰器示例如下:

def decorator(func):
    def wrapper(*args, **kwargs):
        # 在函数调用前增加的功能
        print("函数调用前的操作")
        result = func(*args, **kwargs)
        # 在函数调用后增加的功能
        print("函数调用后的操作")
        return result
    return wrapper

@decorator
def hello():
    print("Hello, World!")

hello()

在这个示例中,我们定义了一个装饰器 decorator,它接受一个函数作为参数,返回一个新的函数 wrapper。新的函数 wrapper 在函数调用前会打印一行文本,然后调用原函数 func,再打印一行文本,最后返回结果。

使用装饰器可以将 decorator 应用到 hello 函数上,这样当调用 hello 函数时,会先执行装饰器中的逻辑,然后再执行 hello 函数的逻辑。

装饰器还可以传递参数,用于指定不同的行为。例如,我们可以定义一个装饰器来记录函数的执行时间,代码如下:

import time

def record_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        execution_time = end_time - start_time
        print(f"函数 {func.__name__} 的执行时间为:{execution_time} 秒")
        return result
    return wrapper

@record_time
def long_running_task():
    # 模拟一个耗时较长的操作
    time.sleep(2)
    print("任务执行完成")

long_running_task()

在这个示例中,我们定义了一个装饰器 record_time,它接受一个函数作为参数,返回一个新的函数 wrapper。新的函数 wrapper 在函数调用前记录开始时间,然后调用原函数 func,再记录结束时间,计算函数的执行时间,并打印出来。

使用装饰器可以将 record_time 应用到 long_running_task 函数上,这样当调用 long_running_task 函数时,会先执行装饰器中的逻辑,然后再执行 long_running_task 函数的逻辑。最后,在控制台上打印出函数的执行时间。

通过使用装饰器,我们可以轻松地为函数添加各种不同的功能。装饰器将原函数包装在另一个函数中,并在这个包装函数中进行修改或者增强。这样一来,我们可以通过不同的装饰器来实现不同的功能,而不需要修改原函数的代码。同时,装饰器还可以提高代码的可读性和可维护性,使代码更加简洁和优雅。