大多数情况下,Python程序员不需要手动进行垃圾回收,因为Python中有自动的垃圾回收机制,能自动的将不需要使用的实例对象进行销毁。
无论是手动销毁还是自动销毁,都会调用__del__()
方法。
class CLanguage:
def __init__(self):
print("调用__init__()方法构造对象")
def __del__(self):
print("调用__del__()销毁对象,释放其空间")
clangs = CLanguage()
del clangs
运行结果为:
调用__init__()方法构造对象
调用__del__()销毁对象,释放其空间
但是千万不要误认为,只要为改实例对象调用了__del__()
方法,改对象所占内存就会被释放。通过下面的代码来看:
class CLanguage:
def __init__(self):
print("调用__init__()方法构造对象")
def __del__(self):
print("调用__del__()销毁对象,释放其空间")
clangs = CLanguage()
# 添加一个引用clang对象的实例对象
cl = clangs
del clangs
print('******')
运行结果为:
调用__init__()方法构造对象
******
调用__del__()销毁对象,释放其空间
注意:最后一行输出信息,是程序执行即将结束时调用__del__()
方法输出的
当程序中有其他变量(比如这里的cl
)引用该实例对象时,即使手动调用了__del__()
方法,该方法也不会立即执行。这与Python的垃圾回收机制有关。
Python 采用自动引用计数(简称 ARC)的方式实现垃圾回收机制。该方法的核心思想是:每个 Python 对象都会配置一个计数器,初始 Python 实例对象的计数器值都为0
,如果有变量引用该实例对象,其计数器的值会加1
,依次类推;反之,每当一个变量取消对该实例对象的引用,计数器会减 1
。如果一个 Python 对象的的计数器值为0
,则表明没有变量引用该 Python 对象,即证明程序不再需要它,此时 Python 就会自动调用 __del__()
方法将其回收。
还是拿上面的例子来说,先使用CLnaguage()
调用该类中的__init__()
方法构造出一个该类的对象 (计数器为0) ,并立即用clangs
这个变量作为所建实例对象的引用 (计数器+1
) 。在此基础上,又有一个cl
变量引用clangs
(本质相当于引用CLanguage(),计数器再+1
) ,这时候调用del clangs
语句,只会计数器-1
,计数器不为0
,因此不会被销毁 (不会执行__del__()
方法) 。
想要计数器变为0
,可以添加一下代码:
del cl
print('------')
调用__init__()方法构造对象
******
调用__del__()销毁对象,释放其空间
------
到这里,当执行del cl
时,其应用的实例对象的计数器继续-1
(此时为0),而对于计数器为0
的实例对象,Python会自动将其视为垃圾回收。