为什么我看不到在python中调用析构函数

2024-03-29 01:01:32 发布

您现在位置:Python中文网/ 问答频道 /正文

{1}写在API上。我使用this文章作为python析构函数的帮助。在

# api.py
class ApiCfg(object):
    def __init__(self, ...):
        # open a connection to a device
        some_device_open()

    def __del__(self):
        print 'Close a connection to some_device'
        # close a connection to a device
        some_device_close()

# Some code
...
api_cfg = ApiCfg()

# myfile.py
from api import *

# Do some stuff
api.run()

我希望在我的屏幕上看到的是这样一个语句:Close connection to some device。但是由于某些原因我不知道。有人能解释一下为什么会这样吗?在


Tags: topyselfapiclosedevicedef文章
2条回答

即使所有操作都已完成,仍会引用该对象。如果您想看到这一行出现,请在创建对象后终止程序。Python必须销毁每个对象,因此__del__方法将运行。

但是,正如注释中指出的,Python不保证将调用此方法。由于Python使用垃圾回收器,所以不应该(或者更确切地说,不期望)手动销毁对象。如果要确保调用了__del__方法,请调用del语句。在

首先,del不保证调用它。这是某些垃圾收集器的“问题”,即:循环引用。在

在您的特定案例中,我看到在init阶段ApiConfig.__init__您打开了与某个设备的连接。这意味着您可能增加了对象上的引用计数器(反之亦然)。通常用户在处理设备(文件、套接字、管道)时,应该自己管理打开/关闭设备,因为del在其对象的引用计数器等于0之前不会被调用。这就是为什么我们通常使用with子句来包装正确管理设备生命周期的块的执行。例如:

with open("filename") as f:
     for line in f:
        pass

您可以使用contextlib.contextmanager修饰符来定义自己的with子句,或者如果需要更复杂的逻辑,则可以使用enterexit方法创建一个类。您可以在doc中查看更多信息并查看此article。在

您还可以通过创建并调用负责正确设备处理(包括正确关闭设备及其gc)的open()close()方法来实现这一点。在

相关问题 更多 >