gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:03:38 25 4
gpt4 key购买 nike

我知道 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++ friend 来说是共享的或“静态的”)变量。该实例肯定有对类变量的引用,不应该先销毁它,因为我们仍然有对它的引用?

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

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

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 - 为什么 Python 在销毁对象之前销毁类变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15401066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com