为什么Python在对象之前销毁类变量?

我知道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

我理解How do I correctly clean up a Python object?的含义.但这种情况适用于类(我的C朋友的共享或’静态’)变量.当然实例有一个类变量的引用,不应该首先销毁它,因为我们仍然有引用它?

在类的对象之前将类销毁是一个问题还是错误?
也许我的问题是“实际存储了类共享变量的位置?”

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

del a1
del a2

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

最佳答案

Maybe my question is ‘Where are class-shared variables actually stored?”

如果这是你的问题,答案就是“在课堂上”.

解决你的大问题:正如你所指出的,__ del__不能依赖全局变量 – 但A是一个全局变量,所以你不能依赖它.有趣的是,我无法在文档中找到关于此的官方声明,但是互联网上有各种各样的参考,即__del__不能使用全局变量. Here是一个:

When a Python program terminates the global variables in each module are set to None. The order in which this happens it undefined

如果您通过self .__ class __.count而不是A.count访问计数,它将起作用. (这也是使用self.count时它的工作原理.)

转载注明原文:为什么Python在对象之前销毁类变量? - 代码日志