簡體   English   中英

從析構函數中的類'dict中刪除一個實例?

[英]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.

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