gpt4 book ai didi

python - 什么时候收集 python 类和类属性垃圾?

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:33 25 4
gpt4 key购买 nike

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

我在输出或 class mem 文件中看不到 Member __del__ class mem,除非我取消注释其中一个 del 语句.为什么是这样?什么时候收集 python 类和类属性垃圾?

最佳答案

这在 http://bugs.python.org/issue1545463 中被报告为错误在 3.4 中修复但没有向后移植(我运行的是 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

关于python - 什么时候收集 python 类和类属性垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28523606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com