【发布时间】:2015-04-15 21:53:18
【问题描述】:
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
除非我取消注释del 语句之一,否则我在输出或class mem 文件中看不到Member __del__ class mem。为什么是这样? python类和类属性什么时候被垃圾回收?
【问题讨论】:
-
您的代码与垃圾收集没有任何关系。
del <identifier>取消引用该标识符,使其不再指向现有对象。当这种情况发生时,your_object.__del__会被调用。一段时间后,在该对象没有任何引用后,它就会被垃圾回收。 -
可能永远不会,这是有据可查的。考虑使用上下文管理器。
-
@cdarke:确实有据可查,而且可能永远不会依赖于 python 版本。我做了一些研究并发布了stackoverflow.com/a/28552889/4455221
标签: python class garbage-collection class-attributes class-attribute