擅长:python、mysql、java
<p>当对象的引用计数达到0时,或者在循环引用的情况下由垃圾收集器遍历时,调用<code>__del__</code>方法。例如,以下各项:</p>
<pre><code>class Foo:
def __del__(self):
print('Foo has been deleted!')
foo = Foo()
del foo
</code></pre>
<p>将正确调用<code>__del__</code>方法并打印<code>Foo has been deleted!</code>,因为分配给<code>foo</code>的对象只被引用一次。现在我们来看看下面的例子:</P>
<pre><code>class Foo:
def __del__(self):
print('Foo has been deleted!')
foo = Foo()
foo.self = foo
del foo
</code></pre>
<p>无法调用<code>__del__</code>方法,因为<code>foo.self</code>将自身作为人质。只有当垃圾收集器遍历它时,才会将其删除。例如:</p>
<pre><code>from gc import collect
class Foo:
def __del__(self):
print('Foo has been deleted!')
foo = Foo()
foo.self = foo
del foo
collect()
</code></pre>
<p>将调用<code>__del__</code>方法,因为我们告诉收集器遍历挂起的对象。不建议这样做,但您可以通过将阈值设置为1来告诉Python遍历所有队列。例如:</p>
<pre><code>from gc import set_threshold
set_threshold(1, 1, 1)
class Foo:
def __del__(self):
print('Foo has been deleted!')
foo = Foo()
foo.self = foo
del foo
</code></pre>
<p>因此,每次实例化一个对象时,收集器都会执行其运行。但同样,不建议这样做,因为这样做成本高昂,并且会影响代码的性能</p>