簡體   English   中英

為什么Python在對象之前銷毀類變量?

[英]Why does Python destroy class variables before objects?

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

在類被銷毀之前銷毀對象。)

也許我的問題是“實際存儲了類共享變量的位置?”

如果這是你的問題,那么答案是“在課堂上”。

解決你的大問題:正如你所指出的, __del__不能依賴全局變量 - 但A是一個全局變量,所以你不能依賴它。 有趣的是,我無法在文檔中找到關於此的正式聲明,但是在互聯網上有各種各樣的參考,即__del__不能使用全局變量。 是一個:

當Python程序終止時,每個模塊中的全局變量都設置為None。 發生這種情況的順序是未定義的

如果您通過self.__class__.count而不是A.count訪問self.__class__.countA.count (這也是使用self.count時它的工作原理。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM