这样想吧:你正在使用一个内部方法要求类自我销毁,这有点像试图咬自己的嘴。
幸运的是,Python具有垃圾回收功能,意味着一旦所有引用超出范围,您的类将被自动销毁。
如果需要在实例被销毁时执行特定操作,您仍然可以覆盖__del__()
方法,它会有点像析构函数。这里有一个愚蠢的例子:
class SelfDestruct:
def __init__(self):
print("Hi! I'm being instanciated!")
def __del__(self):
print("I'm being automatically destroyed. Goodbye!")
def do_stuff(self):
print("I'm doing some stuff...")
现在,尝试在本地范围(如函数)中实例化该类:
def make_a_suicidal_class():
my_suicidal_class = SelfDestruct()
for i in range(5):
my_suicidal_class.do_stuff()
return None
在这里,对象的生命周期受函数限制。这意味着一旦调用完成,它将自动销毁。因此输出应该看起来像:
>>> make_suicidal_class()
"Hi! I'm being instanciated!"
"I'm doing some stuff..."
"I'm doing some stuff..."
"I'm doing some stuff..."
"I'm doing some stuff..."
"I'm doing some stuff..."
"I'm being automatically destroyed. Goodbye!"
>>>
如果你的类在全局范围内被实例化,那么它只有在程序结束时才会被销毁。
另外需要注意的是,手动调用
__del__()
析构函数并不会真正销毁对象。这样做:
foo = SelfDestruct()
foo.__del__()
foo.do_stuff()
结果就是这个输出:
"Hi! I'm being instanciated!"
"I'm being automatically destroyed. Goodbye!"
"I'm doing some stuff..."
因此,该实例仍然存在... 如果您真的需要防止在当前范围内再次引用该实例,则必须调用 del foo
。
正如先前所述,Python 实际上对类和变量进行引用计数。因此,如果您的类对象在其他地方被使用,调用 del foo
实际上不会释放它所占用的内存。
这里是 Python 文档中详尽的说明:https://docs.python.org/2.5/ref/customization.html
“del x” 并未直接调用 x.del() —— 前者将 x 的引用计数减少一,只有当 x 的引用计数为零时才会调用后者。
长话短说:不要过多考虑!让 Python 处理内存管理。垃圾回收的整个目的就是停止担心变量的生命周期!
x = Foo(); del x
可以删除由Foo()
创建的对象的唯一引用。然而,并不总是那么简单。您不能直接操作引用计数(如果您足够努力,几乎任何事情都有可能,但这会导致非常糟糕的结果)。 - juanpa.arrivillagacreateobject
实例的方法正在运行时,你都不能删除它。 - Maurice Meyer