如何正确清理Python对象?
通过将全局变量设置为None来清理全局。本地变量在会话结束时自动销毁。Python调用的del函数将全局变量设置为None。
考虑以下代码,其中清理给定类中所有对象:
更多Python相关文章,请阅读:Python 教程
示例
class Counter:
Count = 0 # 这是这个类的对象计数
def __init__(self, name):
self.name = name
print name,'created'
Counter.Count += 1
def __del__(self):
print self.name,'deleted'
Counter.Count -= 1
if Counter.Count == 0:
print 'Last Counter object deleted'
else:
print Counter.Count,'Counter objects remaining'
x = Counter("First")
del x
没有最后一个del,会导致异常。
关于__del__的Python文档提醒:
警告:由于__del__()方法调用的不稳定情况,执行期间发生的异常会被忽略,并打印一条消息到sys.stderr中。同时,当在响应删除模块时调用__del__()(例如,在程序执行完成时),__del__()方法引用的其他全局变量可能已被删除。因此,__del__()方法应该尽可能少地进行维护外部不变量。
如果没有显式调用del,则__del__仅在程序的末尾被调用,Counter和/或Count可能已经被GC回收,__del__被调用的时候(对象被收集的顺序是非确定性的)。异常意味着Counter已被回收。你不能用__del__做任何特别复杂的事情。
这里有两种可能的解决方案。
-
使用显式终结器方法,例如文件对象的close()。
-
使用弱引用。
极客教程