擅长:python、mysql、java
<p>首先,<strong>del</strong>不保证调用它。这是某些垃圾收集器的“问题”,即:循环引用。在</p>
<p>在您的特定案例中,我看到在init阶段<code>ApiConfig.__init__</code>您打开了与某个设备的连接。这意味着您可能增加了对象上的引用计数器(反之亦然)。通常用户在处理设备(文件、套接字、管道)时,应该自己管理打开/关闭设备,因为<strong>del</strong>在其对象的引用计数器等于0之前不会被调用。这就是为什么我们通常使用<code>with</code>子句来包装正确管理设备生命周期的块的执行。例如:</p>
<pre><code>with open("filename") as f:
for line in f:
pass
</code></pre>
<p>您可以使用<a href="https://docs.python.org/2.7/library/contextlib.html" rel="nofollow noreferrer">contextlib.contextmanager</a>修饰符来定义自己的with子句,或者如果需要更复杂的逻辑,则可以使用<strong>enter</strong>和<strong>exit</strong>方法创建一个类。您可以在doc中查看更多信息并查看此<a href="https://jeffknupp.com/blog/2016/03/07/python-with-context-managers/" rel="nofollow noreferrer">article</a>。在</p>
<p>您还可以通过创建并调用负责正确设备处理(包括正确关闭设备及其gc)的<code>open()</code>和<code>close()</code>方法来实现这一点。在</p>