8

我了解 Python 不保证程序结束时对象的销毁顺序,甚至不保证它会发生。

所以我明白一个类的析构函数不能依赖全局变量,包括其他模块。

但我会认为类的对象必须在类被销毁之前被销毁。显然不是:

class A(object):
    count = 0
    def __init__(self):
        A.count += 1
        print 'Creating object, there are now', A.count
    def __del__(self):
        A.count -= 1
        print 'Destroying object, there are now', A.count

a1 = A()
a2 = A()

在 Windows 7 x64 Python v2.7.3 上,我得到:

Creating object, there are now 1
Creating object, there are now 2
Exception AttributeError: "'NoneType' object has no attribute 'count'" in <bound
 method A.__del__ of <__main__.A object at 0x0234B8B0>> ignored
Exception AttributeError: "'NoneType' object has no attribute 'count'" in <bound
 method A.__del__ of <__main__.A object at 0x0234BE90>> ignored

我了解如何正确清理 Python 对象的含义?. 但这种情况适用于类(我的 C++ 朋友的共享或“静态”)变量。实例肯定有对类变量的引用,它不应该首先被销毁,因为我们仍然有对它的引用?

在该类的对象之前销毁该类是问题还是错误?也许我的问题是“类共享变量实际存储在哪里?”

(是的,我知道这可以使用上下文管理器来纠正,甚至简单地:

del a1
del a2

在类被销毁之前销毁对象。)

4

1 回答 1

6

也许我的问题是“类共享变量实际存储在哪里?”

如果这是您的问题,答案是“在课堂上”。

为了解决您更大的问题:正如您所指出的,__del__不能依赖全局变量 - 但A它是一个全局变量,因此您不能依赖它。有趣的是,我在文档中找不到关于这一点的官方声明,但互联网上有各种关于__del__不能使用全局变量的事实的参考。 是一个:

当 Python 程序终止时,每个模块中的全局变量都设置为 None。发生这种情况的顺序未定义

self.__class__.count如果您通过而不是访问计数,它将起作用A.count。(这也是为什么它在你使用时起作用的原因self.count。)

于 2013-03-14T04:16:47.213 回答