如何使用装饰器函数?——Python装饰器函数的详解和实例展示
装饰器是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_name 将 print_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 毫秒 函数执行完成!
我们成功地给原函数添加了计算执行时间的功能,并且可以根据需要指定时间的单位。
总结来说,使用装饰器函数可以方便地给函数添加额外的功能,而不需要修改原函数的代码。在实际的开发中,装饰器函数可以用来实现日志记录、性能计时、权限验证等功能的增加。它提高了代码的可维护性,使得代码更加清晰和易于调试。
