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

如何使用装饰器函数?——Python装饰器函数的详解和实例展示

发布时间:2023-10-09 01:50:21

装饰器是Python中非常有用的功能,它允许我们在函数不修改原有代码的情况下,对函数进行功能的增加或修改。装饰器函数是一个用来装饰其他函数的函数,它可以在被装饰的函数执行前后添加额外的功能。

装饰器函数的定义比较简单:

def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        # 在原函数执行前添加的额外功能
        result = original_function(*args, **kwargs)
        # 在原函数执行后添加的额外功能
        return result
    return wrapper_function

在该示例中,original_function 是被装饰的函数,wrapper_function 是用来添加额外功能的函数。wrapper_function 内部首先执行了原函数(original_function),然后在原函数执行前后可以添加一些额外的功能。

以下是一个使用装饰器函数的例子:

def print_function_name(original_function):
    def wrapper_function(*args, **kwargs):
        print(f"正在执行函数: {original_function.__name__}")
        result = original_function(*args, **kwargs)
        return result
    return wrapper_function

@print_function_name
def hello():
    print("Hello, world!")

hello()

在这个例子中,我们定义了一个装饰器函数 print_function_name,它在被装饰的函数执行前输出函数的名称。

我们使用 @print_function_nameprint_function_name 装饰器应用到 hello 函数上,相当于执行了 hello = print_function_name(hello)。这样,在调用 hello 函数时,实际上会执行 print_function_name 中的 wrapper_function 函数,从而输出函数的名称,并执行原函数的内容。

运行以上代码,输出结果为:

正在执行函数: hello
Hello, world!

这样,我们就成功地给原函数添加了额外的功能。

使用装饰器函数还可以传递参数,下面是一个简单的例子:

def log_execution_time(unit):
    def decorator_function(original_function):
        import time

        def wrapper_function(*args, **kwargs):
            start_time = time.time()
            result = original_function(*args, **kwargs)
            end_time = time.time()
            execution_time = (end_time - start_time) * 1000
            print(f"函数 {original_function.__name__} 的执行时间为: {execution_time} {unit}")

            return result

        return wrapper_function

    return decorator_function

@log_execution_time("毫秒")
def my_function():
    import time
    time.sleep(1)
    print("函数执行完成!")

my_function()

在这个例子中,我们定义了一个装饰器函数 log_execution_time,它接受一个参数 unit,用来指定时间的单位。装饰器函数中再定义了一个 wrapper_function 函数,用来计算函数的执行时间,并输出执行时间。

我们使用 @log_execution_time("毫秒") 将装饰器应用到 my_function 函数上,相当于执行了 my_function = log_execution_time("毫秒")(my_function)。这样,在调用 my_function 函数时,实际上会执行 log_execution_time("毫秒") 中的 decorator_function 函数,然后再执行 decorator_function 中的 wrapper_function 函数。

运行以上代码,输出结果为:

函数 my_function 的执行时间为: 1002.2738933563232 毫秒
函数执行完成!

我们成功地给原函数添加了计算执行时间的功能,并且可以根据需要指定时间的单位。

总结来说,使用装饰器函数可以方便地给函数添加额外的功能,而不需要修改原函数的代码。在实际的开发中,装饰器函数可以用来实现日志记录、性能计时、权限验证等功能的增加。它提高了代码的可维护性,使得代码更加清晰和易于调试。