【问题标题】:How to make an object indestructible even with force deletion?即使强制删除,如何使对象坚不可摧?
【发布时间】:2016-06-28 20:08:37
【问题描述】:

我怎样才能使一个对象坚不可摧,即使使用del 保留字(我认为这意味着强制删除)它也不会被删除?

我将对象存储在列表中,如下所示:

list = [obj1, obj2, obj3, obj4 ....]
del list[0]

我想我必须在对象类中使用 __del__() 做一些技巧,但是如何?

【问题讨论】:

  • 对象仅在没有引用它们的名称时才会被删除。在那种情况下,你的对象不能被使用,那你为什么要它存在呢?
  • del 并不意味着“强制删除”。
  • del 删除 name,而不是对象。仅当删除指向它的所有名称时,才会删除该对象。
  • @mertyildiran:这个问题表明对del 和对象删除的误解。该问题的答案显示了更好的方法来实现该问题试图用del 做的事情。 想用del做什么?基本上,当一个对象在 Python 中被删除时,你无法控制。 Python中没有“强制删除”之类的东西。
  • @mertyildiran 这不是 C,您不分配内存块,而是创建对象并为其命名。

标签: python class object del


【解决方案1】:

python 中的对象具有引用计数,这基本上意味着对象存在的位置数量。使用del 删除对该对象的一个​​引用(它不会强制删除它)。然后在剩下 0 个引用时调用 __del__。您可以创建对该对象的新引用,这样可以防止它被删除,如下所示:

class obj:
    def __del__(self):
         global _ref
         _ref = self
         return

这将通过创建全局引用来防止删除对象。 请记住,不建议这样做,因为它会阻止垃圾收集器正常工作。

更新:

如果您使用的是列表,则应将其转换为不可变对象,例如 tuple,以防止像这样删除之类的更改:

mylist = [obj1, obj2, obj3, obj4 ....]
mylist = tuple(mylist)

【讨论】:

  • 我刚刚意识到我需要使用像 tuple 这样的不可变对象来存储引用我的“受保护”对象的名称。请将此添加到您的答案中,我会做出正确的答案。
  • @mertyildiran 已添加,但请记住,转换为元组不允许对元组本身进行任何修改(但它允许修改内部对象)
猜你喜欢
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多