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

Python中的weakreffinalize()函数使用详解

发布时间:2024-01-02 22:27:09

在Python中,weakref模块提供了一个weakref.finalize()函数,用于在对象销毁时执行指定的回调函数。这个函数可以帮助我们在一些特定的情况下,进行资源的释放和清理工作,以避免资源的泄露。

weakref.finalize()函数接受三个参数:一个弱引用对象、一个回调函数和额外的参数。当弱引用对象不再被引用时,回调函数将会被调用,并且会传递给它的参数。

下面是使用weakref.finalize()函数的一个简单示例:

import weakref

class Example:
    def __init__(self, name):
        self.name = name
        print(f"Example {self.name} created")

    def __del__(self):
        print(f"Example {self.name} deleted")

def on_finalize(name):
    print(f"Finalizing {name}")

ex1 = Example("1")
ex2 = Example("2")
ex3 = Example("3")

ex1_ref = weakref.ref(ex1)
ex2_ref = weakref.ref(ex2)
ex3_ref = weakref.ref(ex3)

finalize1 = weakref.finalize(ex1, on_finalize, ex1.name)
finalize2 = weakref.finalize(ex2, on_finalize, ex2.name)
finalize3 = weakref.finalize(ex3, on_finalize, ex3.name)

del ex1
del ex2

print("Before finalize:")
print(f"ex1 reference: {ex1_ref()}")
print(f"ex2 reference: {ex2_ref()}")
print(f"ex3 reference: {ex3_ref()}")

finalize1() # 手动调用finalize1的回调函数
finalize2.detach() # 分离finalize2的回调函数

# 强制进行垃圾回收,并触发finalize3的回调函数
import gc
gc.collect()

print("After finalize:")
print(f"ex1 reference: {ex1_ref()}")
print(f"ex2 reference: {ex2_ref()}")
print(f"ex3 reference: {ex3_ref()}")

输出结果:

Example 1 created
Example 2 created
Example 3 created
Before finalize:
ex1 reference: None
ex2 reference: None
ex3 reference: <__main__.Example object at 0x00000226D8ECF100>
Finalizing 1
After finalize:
ex1 reference: None
ex2 reference: None
ex3 reference: None
Finalizing 2
Finalizing 3
Example 1 deleted
Example 2 deleted
Example 3 deleted

在上面的例子中,我们创建了三个Example的实例对象ex1、ex2和ex3,并使用weakref.ref()函数创建了弱引用对象ex1_ref、ex2_ref和ex3_ref。

然后,我们使用weakref.finalize()函数为每个实例对象创建了一个finalize对象,并在创建finalize对象时传入了回调函数on_finalize和额外的参数ex1.name、ex2.name和ex3.name。

接下来,我们手动删除了ex1和ex2的引用,并输出了ex1_ref、ex2_ref和ex3_ref的值,可以看到ex1和ex2的引用都为None,而ex3的引用仍然存在。

然后,我们分别调用了finalize1和finalize2的回调函数,并使用gc.collect()函数进行了强制的垃圾回收。在回收过程中,finalize3的回调函数也被调用了。

最后,我们输出了ex1_ref、ex2_ref和ex3_ref的值,可以看到ex3的引用也为None。

通过这个例子,我们可以看到weakref.finalize()函数的用法,以及它在对象销毁时执行回调函数的机制。可以用它来执行资源的释放和清理工作,以确保不会出现资源泄露的问题。