[英]Delete an instance from its class' dict in desctructor?
我正在嘗試創建一個將其所有實例保存在字典中的類:
>>> class X:
def __new__(cls, index):
if index in cls._instances:
return cls._instances[index]
self = object.__new__(cls)
self.index = index
cls._instances[index] = self
return self
def __del__(self):
del type(self)._instances[self.index]
_instances = {}
但是, __del__
似乎不起作用:
>>> x = X(1)
>>> del x
>>> X._instances
{1: <__main__.X object at 0x00000000035166D8>}
>>>
我究竟做錯了什么?
基於Kirk Strauser的回答,我想指出,當你使用del x
,類' _instances
仍然保留了對x
另一個引用 - 因此它不能被垃圾收集(並且__del__
將不會運行。
你可能應該使用weakref
s ,而不是做這種低級魔法,這是專門為此目的而實現的。
WeakValueDictinary ,特別適合您的需求完美,你可以填寫它__init__
,而不是亂搞__new__
和__del__
你沒有做錯什么,但是__del__
並不是你想的那么。 從它上面的文檔 :
注意
del x
不直接調用x.__del__()
- 前者將x
的引用計數遞減1,而后者僅在x
的引用計數達到零時調用。
從解釋器運行此操作尤其棘手,因為命令歷史記錄或其他機制可能會在不確定的時間內保留對x
引用。
順便說一句,你的代碼看起來非常像一個默認的X
作為工廠。 使用類似的東西更直接(更多Pythonic)關於你想要做的事情可能更直截了當。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.