gpt4 book ai didi

python - __del__ 方法在不期望的情况下在 python 中被调用

转载 作者:太空狗 更新时间:2023-10-29 22:01:20 27 4
gpt4 key购买 nike

我是 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')
Initializing Swaroop
Initializing Kalem

execfile(u'C:\1_eric\Python\test1.py')
Initializing Swaroop
Swaroop says bye
I am the last one
Initializing Kalem
Kalem says bye
I am the last one

为什么第二次运行__init__后立即调用__del__方法?
我猜测,由于正在使用相同的实例名称(“swaroop”和“kaleem”),因此它正在释放原始实例并对其进行垃圾收集。但是,这似乎正在破坏当前的人口数量。

这是怎么回事?
避免这种混淆的好方法是什么?
避免使用 __del__? 在重新使用它们之前检查现有的实例名称? ...

谢谢,埃里克

最佳答案

这里发生了几件事。当您的 Person4 类被实例化时,它会将其 population 类变量初始化为 0。在您的交互式控制台中,您似乎多次运行“test1.py”文件。第二次运行它时,Person4 类被再次声明,这使得它在技术上与第一次不同(即使它具有相同的名称)。这意味着它有自己独立的 population 计数。

现在,swaroopkaleem全局 变量,在“test1.py”的两个实例之间共享。 Python 在内部对其大部分自动垃圾收集使用引用计数,因此第一个 Person4 类的原始实例直到第二次分配给 swaroop 时才会被释放。分配给 swaroop 会减少第一个实例的引用计数,导致 __del__ 被调用,因为引用计数现在为零。但是因为您在 __del__() 中通过名称引用 Person4,所以当 previous 实例消失时,它会递减 new Person4.population 计数,而不是旧的 Person4 人口计数。

希望这是有道理的。我明白为什么这可能会让学习 Python 的人感到困惑。您在使用 execfile() 重新定义 Person4 类的同时使用了类变量,这更加令人困惑。值得一提的是,我已经编写了很多 Python 代码,而且我认为我从来不需要使用 __del__ 特殊方法。

关于python - __del__ 方法在不期望的情况下在 python 中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1935153/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com