ovo*_*vod 0 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
Run Code Online (Sandbox Code Playgroud)
我的主文件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
Run Code Online (Sandbox Code Playgroud)
但是当我删除m4时,没有调用打印但是删除了该对象.并且无法找到为什么没有显示该__del__方法的打印?
Python只从内存中删除对象(__del__如果有任何内容,则调用它们的钩子)当没有对象留下任何引用时.
m4引用m3,反过来引用m2,等等.因此,直到删除所有四个对象, Python才能释放任何这些对象.
__del__如果您使用的是Python 3.3或之前,您仍然不会看到被调用; 当你在这里创建循环引用时,即使垃圾收集器也不会释放它们,因为你的对象有__del__钩子.查看gc.garbage文档:
具有
__del__()方法并且是参考循环的一部分的对象导致整个参考循环无法收集,包括不一定在循环中但仅可从其中访问的对象.Python不会自动收集这样的循环,因为一般来说,Python不可能猜测运行__del__()方法的安全顺序.
Python 3.4实现了PEP 442,消除了这一限制.
如果您不希望某些引用计入对象生存期或被视为循环引用,则应使用弱引用.
您可以使用weakref.WeakSet()类级别的对象,将实例添加到该级别.如果在调用时该集合为空__del__,则删除最后一个实例.