擅长:python、mysql、java
<p><code>classMem</code>是类<code>WithMembers</code>的一个类变量,这意味着它将被这个类的所有实例共享。在Python中,这是一个全局性的问题。
这就是为什么退出程序时没有调用类成员的<code>__del__</code>。在</p>
<p>这里有一个问题:为什么Python在退出程序时不简单地将所有引用计数设置为0,以便调用所有<code>__del__</code>函数?在</p>
<P>类似C++,它保证调用全局变量的析构函数。在Python中保证这一点的唯一方法是运行所有模块并删除它们的所有变量。但这意味着<code>__del__</code>方法不能相信它可能要使用的任何全局变量仍然存在,因为无法知道要以什么顺序删除变量。在</p>
<p>有两种方法可以强制销毁<code>classMem</code>。在</p>
<p>一个是<code>del WithMembers.classMem</code>。这将减少对0的引用计数,并且将自动调用<code>__del__</code>。在</p>
<p>另一个是使类<code>WithMembers</code>成为一个旧样式的类(不是从<code>object</code>继承的)。像这样:</p>
<pre><code>...
class WithMembers:
def __init__(self):
print "WithMembers __init__"
print WithMembers.classMem
self.instanceMem = Member("instance mem")
...
</code></pre>
<p>输出将是:</p>
^{pr2}$
<p>这里有一个非常有用的链接,可以帮助你更好地理解这个答案。
<a href="http://www.electricmonk.nl/log/2008/07/07/python-destructor-and-garbage-collection-notes/" rel="nofollow">http://www.electricmonk.nl/log/2008/07/07/python-destructor-and-garbage-collection-notes/</a></p>
<p>希望有帮助。:)</p>