1

A类:def __get(self):返回self._x

 def __set(self, y):
  self._x = y

 def __delete_x(self):
  print('DELETING')
  del self._x

 x = property(__get,__set,__delete_x)

b = A()

# Here, when b is deleted, i'd like b.x to be deleted, i.e __delete_x()
# called (and for immediate consequence, "DELETING" printed)
del b
4

3 回答 3

2

del语句的语义并不真正适合您在这里想要的。del bsimple 从本地范围框架/字典中删除对A您刚刚实例化的对象的引用;这不会直接导致对对象本身执行任何操作。如果这是对对象的最后一次引用,那么引用计数下降到零,或者垃圾收集器收集一个循环,可能会导致对象被释放。您可以通过向__del__对象添加方法或添加执行所需操作的弱引用回调来观察这一点。

不过,后两种解决方案似乎都不是一个好主意。__del__方法阻止垃圾收集器收集任何涉及对象的循环;虽然weakrefs 不会遇到这个问题,但无论哪种情况,您都可能在奇怪的环境中运行(例如在程序关闭期间),这可能会使您难以完成您想要完成的事情。

如果您可以扩展您的确切用例,则可能有一种完全不同的方法来实现您想要的最终目标,但很难根据这样一个普遍且有限的示例进行推测。

于 2010-02-02T00:24:47.830 回答
1

A要控制类实例消失时发生的情况(无论是被删除还是垃圾收集),您可以__del__(self)A. 如果您希望在该实例的特定属性消失时涉及您的代码,您可以__del__使用具有受到弱引用的影响,因此您可能还需要对这种情况进行一些包装)。

__del__如果可能的话,通常最好避免,因为它会干扰垃圾收集,从而在您有循环引用时导致“内存泄漏”。

于 2010-02-02T00:20:03.973 回答
0

一个丑陋的方法是:

def __del__(self):
    for x in dir(self.__class__):
        if type(getattr(self.__class__, x)) == property:
            getattr(self.__class__, x).fdel(self)
于 2010-02-02T01:13:13.247 回答