Python中的装饰器
- 经常在插入日志、性能测试、事务处理等场景中使用
- 装饰器是一种特殊的函数,用于修改或扩展其他函数的功能。它们实质上是一个函数(称为装饰器函数),接受一个函数作为参数,并返回一个新的函数
- 装饰器可以用于在不修改原始函数代码的情况下,对其功能进行修改、增强或包装。这种方式很有用,特别是当你想要在多个函数中共享一些通用的代码逻辑时
def decorator_func(original_func):
def wrapper_func(*args, **kwargs):
# 在原始函数之前执行的附加代码
print("Before function execution")
# 调用原始函数
result = original_func(*args, **kwargs)
# 在原始函数之后执行的附加代码
print("After function execution")
# 返回原始函数的结果
return result
# 返回包装函数
return wrapper_func
上面的代码定义了一个简单的装饰器函数 decorator_func。它将一个函数作为参数 original_func,并返回一个新的函数 wrapper_func。
要使用装饰器,我们可以通过在目标函数上使用 @decorator_func 语法来应用装饰器:
@decorator_func
def my_function():
print("Inside the function")
# 调用被装饰的函数
my_function()
运作截图
在上面的示例中,my_function 函数被 decorator_func 装饰器包装。当我们调用 my_function 时,实际上是调用了装饰器返回的 wrapper_func,从而实现了在函数执行前后添加额外的代码。
装饰器还可以接收参数,并根据参数来定制装饰器的行为。这种装饰器被称为带参数的装饰器。
装饰器在实际开发中有很多应用,例如:日志记录、性能计时、输入验证等。通过使用装饰器,我们可以将这些功能与原始函数分离开来,提高代码的可读性和模块化程度。
拓展:闭包
- 闭包(Closure)是一种函数及其相关引用的组合。在 Python 中,闭包是指内部函数可以访问外部函数作用域中变量的函数
- 为了形成闭包,通常满足以下条件:
- 存在一个嵌套的函数
- 内部函数引用了嵌套函数外部的变量
- 嵌套函数被作为返回值返回
- 闭包的主要特点是内部函数可以记住并访问其创建时所在的环境,即使该环境已经不存在
def outer_func(x):
def inner_func(y):
return x + y
return inner_func
closure = outer_func(10)
print(closure(5))
# 输出:15
在上面的示例中,outer_func 是一个外部函数,它接受一个参数 x。在 outer_func 中定义了一个内部函数 inner_func,它引用了外部函数的变量 x。最后,outer_func 返回了内部函数 inner_func。我们将 outer_func(10) 的结果赋值给变量 closure,从而形成了一个闭包
通过调用 closure(5),我们可以看到内部函数 inner_func 访问并使用了外部函数 outer_func 的变量 x,结果为 15
闭包的一个重要应用是它可以在函数式编程中创建具有状态的函数或对象。通过闭包,我们可以将数据和操作封装在一个函数内部,实现了数据的私有化和封装性
需要注意的是,过度使用闭包可能导致内存泄漏,因为闭包会持有其创建时的环境。因此,在使用闭包时需要谨慎处理,避免不必要的内存占用