1. Python装饰器的基本概念和语法
Python装饰器是一种高级技术,它可以让我们在不改变原有代码的情况下添加新的功能或修改原有功能。装饰器本质上就是一个函数,被装饰的函数作为它的参数,装饰器对被装饰函数进行修改或添加新的行为。下面是Python装饰器的基本语法:
def my_decorator(func):
def wrapper(*args, **kwargs):
# 添加新的行为
result = func(*args, **kwargs)
# 修改原有行为
return result
return wrapper
@my_decorator
def my_function():
pass
在上面的代码中,我们定义了一个名为“my_decorator”的装饰器函数,它包含一个名为“wrapper”的内部函数。通过@my_decorator语法糖,我们可以将装饰器应用于“my_function”函数。在执行“my_function”函数时,实际上是执行了“my_decorator(wrapper(my_function))”。
2. Python装饰器的应用场景
2.1 函数执行前的准备工作
有时候我们需要在函数执行前做一些准备工作,例如设置环境变量、打开数据库连接等等。这时候我们就可以使用Python装饰器。下面是一个简单的例子:
def prepare(func):
def wrapper(*args, **kwargs):
# 设置环境变量
os.environ['ENV'] = 'dev'
# 执行函数
result = func(*args, **kwargs)
return result
return wrapper
@prepare
def my_function():
print("Hello, world!")
在上面的代码中,我们定义了一个“prepare”装饰器函数,它可以在函数执行前设置环境变量。当我们执行“my_function”函数时,它会先执行“prepare”装饰器函数,在执行“my_function”函数。
2.2 函数执行后的收尾工作
有时候我们需要在函数执行后做一些收尾工作,例如关闭数据库连接、删除临时文件等等。这时候我们也可以使用Python装饰器:
def cleanup(func):
def wrapper(*args, **kwargs):
# 执行函数
result = func(*args, **kwargs)
# 关闭数据库连接
db.close()
# 删除临时文件
os.remove('temp.txt')
return result
return wrapper
@cleanup
def my_function():
print("Hello, world!")
在上面的代码中,我们定义了一个“cleanup”装饰器函数,它可以在函数执行后关闭数据库连接、删除临时文件等。当我们执行“my_function”函数时,它会先执行“my_function”函数,在执行“cleanup”装饰器函数。
2.3 函数执行耗时统计
有时候我们需要统计函数执行的耗时,了解函数的性能表现。这时候我们也可以使用Python装饰器:
import time
def performance(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"Function {func.__name__} takes {end-start} seconds to execute.")
return result
return wrapper
@performance
def my_function():
time.sleep(1)
print("Hello, world!")
在上面的代码中,我们定义了一个“performance”装饰器函数,它可以统计函数执行的耗时。当我们执行“my_function”函数时,它会先执行“performance”装饰器函数,在执行“my_function”函数。
2.4 函数执行返回值检查
有时候我们需要对函数的返回值进行检查,确保其符合我们的预期结果。这时候我们也可以使用Python装饰器:
def check(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
if not isinstance(result, int):
raise TypeError("Expected an integer.")
return result
return wrapper
@check
def my_function(x):
return x+1
在上面的代码中,我们定义了一个“check”装饰器函数,它可以检查函数的返回值是否为整数。当我们执行“my_function”函数时,它会先执行“check”装饰器函数,在执行“my_function”函数。
2.5 函数执行异常处理
有时候我们需要对函数执行过程中出现的异常进行处理,确保程序的正常运行。这时候我们也可以使用Python装饰器:
def handle_exception(func):
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
return result
except Exception as e:
print(f"An exception occurred: {str(e)}.")
return None
return wrapper
@handle_exception
def my_function(x):
return 10/x
在上面的代码中,我们定义了一个“handle_exception”装饰器函数,它可以对函数执行过程中出现的异常进行处理。当我们执行“my_function”函数时,它会先执行“handle_exception”装饰器函数,在执行“my_function”函数。