我是新手,正在学习Python,并且正在通过Swaroop CH的《Python简明教程》中的例子进行学习。我发现__del__
方法的行为让我感到困惑。
基本上,如果我在Python 2.6.2中运行以下脚本:
class Person4:
'''Represents a person'''
population = 0
def __init__(self, name):
'''Initialize the person's data'''
self.name = name
print 'Initializing %s'% self.name
#When the person is created they increase the population
Person4.population += 1
def __del__(self):
'''I am dying'''
print '%s says bye' % self.name
Person4.population -= 1
if Person4.population == 0:
print 'I am the last one'
else:
print 'There are still %d left' % Person4.population
swaroop = Person4('Swaroop')
kaleem = Person4('Kalem')
在使用Python控制台(或Spyder交互式控制台)时,我看到了以下内容:
execfile(u'C:\1_eric\Python\test1.py')
初始化Swaroop
初始化Kalemexecfile(u'C:\1_eric\Python\test1.py')
初始化Swaroop
Swaroop说再见
我是最后一个
初始化Kalem
Kalem说再见
我是最后一个
为什么第二个运行后__init__
方法立刻被调用了?
我猜测因为相同的实例名称('swaroop'和'kaleem')被重复使用,导致原始实例被释放和垃圾回收。但是,这似乎会对当前人口统计数据造成困扰。
这里发生了什么?有什么好的方法可以避免这种混淆?
是避免使用__del__
方法?还是在重复使用实例名称之前检查其是否存在?...
谢谢, Eric
__del__
方法在任何特定时间被调用。将来垃圾回收器可能会改变,以便在不同的时间调用__del__
。 - Georg Schölly