class Member(object):
def __init__(self, identifier):
self.identifier = identifier
print "Member __init__", self.identifier
def __del__(self):
print "Member __del__", self.identifier
with open("/home/might/" + self.identifier, "w") as outF:
outF.write(self.identifier)
class WithMembers(object):
def __init__(self):
print "WithMembers __init__"
print WithMembers.classMem
self.instanceMem = Member("instance mem")
def __del__(self):
print "WithMembers __del__"
classMem = Member("class mem")
if __name__ == "__main__":
print "main"
WithMembers()
#del WithMembers.classMem # "Member __del__ class mem" before "end"
#del WithMembers # "Member __del__ class mem" after "end"
print "end"
上面的代码位于Hidden.py中,运行python Hidden.py
产生以下输出:
Member __init__ class mem
main
WithMembers __init__
<__main__.Member object at 0x935aeec>
Member __init__ instance mem
WithMembers __del__
Member __del__ instance mem
end
除非取消注释其中之一,否则我不会Member __del__ class mem
在输出或class mem
文件中看到del
。为什么是这样?何时收集python类和类属性垃圾?
这是在3.4中修复的http://bugs.python.org/issue1545463中报告的一个错误,但没有反向移植(我正在运行2.7)。在http://code.activestate.com/lists/python-list/504216/中也对此进行了说明。请参阅下面的python 3.5中的输出。
基于以上内容,我的理解是,在2.7中,WithMembers
解释器退出时,新样式类仍然存在(未被GC清理)。结果,classMem
不会进行垃圾回收,因为WithMembers
仍在引用它。
请注意,新样式类具有对它们的循环引用__mro__
以及一些内置的描述符(http://bugs.python.org/issue17950)。即使模块级别的新类在模块清除后被GC认为已死,但在模块清除被禁用后,GC调用以清除它们,因为它引起了太多其他问题。
这不会导致内存泄漏,因为操作系统会在解释器退出后清理资源。
class Member(object):
def __init__(self, identifier):
self.identifier = identifier
print("Member __init__ " + self.identifier)
def __del__(self):
print("Member __del__ " + self.identifier)
with open("/home/might/" + self.identifier, "w") as outF:
outF.write(self.identifier)
class WithMembers(object):
def __init__(self):
print("WithMembers __init__")
print(WithMembers.classMem)
self.instanceMem = Member("instance mem")
def __del__(self):
print("WithMembers __del__")
classMem = Member("class mem")
if __name__ == "__main__":
print("main")
WithMembers()
print("end")
使用以下命令运行时输出以下内容python3 Hidden.py
:
Member __init__ class mem
main
WithMembers __init__
<__main__.Member object at 0xb6fc8e2c>
Member __init__ instance mem
WithMembers __del__
Member __del__ instance mem
end
Member __del__ class mem
Exception ignored in: <bound method Member.__del__ of <__main__.Member object at 0xb6fc8e2c>>
Traceback (most recent call last):
File "class_member_gc.py", line 8, in __del__
NameError: name 'open' is not defined
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句