Python对象不会被删除

时间:2014-11-23 21:43:42

标签: python methods del

我有下一个代码(这里我试着抓住最后一个对象):

class Mogican(object):
    last = None

    def __init__(self, name):
        # print("Created")
        self.name = name
        self.prev = None
        self.next = None
        if self.__class__.last == None:
            self.__class__.last = self
            self.prev = None
            self.next = None
        else:
            self.prev = self.__class__.last
            self.__class__.last.next = self
            self.__class__.last = self
            self.next = None

    def __del__(self):
        print("Deleted")
        if self.next == None:
            print("here")
            self.__class__.last = self.prev
            self.prev.next = None
        else:
            print("no here")
            self.prev.next = self.next

            self.next.prev = self.prev

我的主文件是main.py:

from Mogican import Mogican

if __name__ == '__main__':
    m1 = Mogican('adin')
    m2 = Mogican('dva')
    m3 = Mogican('tree')
    m4 = Mogican('Cheture')

    # print Mogican.last.name

    print m4
    del m4

但是当我删除m4时,没有调用打印但是删除了该对象。并且无法找到__del__方法没有显示打印的原因?

1 个答案:

答案 0 :(得分:6)

Python只从内存中删除对象(如果有任何内容,则调用它们的__del__挂钩)当对象没有任何引用时。

m4引用了{p> m3m2引用了__del__等等。所以直到所有四个对象都被删除才能使Python能够释放任何这些对象。

如果您使用的是Python 3.3或之前,您仍然不会看到__del__被调用;当你在这里创建循环引用时,即使垃圾收集器也不会释放它们,因为你的对象有__del__()个钩子。请参阅gc.garbage documentation

  

具有__del__()方法且属于引用循环的对象会导致整个引用循环无法收集,包括不一定在循环中但只能从其中访问的对象。 Python不会自动收集这样的循环,因为一般来说,Python无法猜测运行__del__方法的安全顺序。

Python 3.4实现了PEP 442,删除了这个限制。

如果您不希望某些引用计入对象生命周期或被视为循环引用,则应使用weak references

您可以在类级别使用weakref.WeakSet()对象,将实例添加到该级别。如果在调用{{1}}时该集合为空,则会删除您的上一个实例。