python - 在对象的第二次初始化时,为什么 __init__ 在 __del__ 之前被调用?

标签 python oop

考虑以下示例代码

class A:
    def __init__(self, i):
        self.i = i
        print("Initializing object {}".format(self.i))

    def __del__(self):
        print("Deleting object {}".format(self.i))

for i in [1, 2]:
    a = A(i)

在循环中创建对象旨在确保在创建新的 A 对象之前调用 A 的析构函数。但显然发生了以下情况:

Initializing object 1

Initializing object 2

Deleting object 1

Deleting object 2

为什么只有在新对象初始化后才调用对象 1 的析构函数?这是预期的行为吗?我知道 for 循环在 python 中没有自己的范围。例如,在 C++ 中,1 的析构函数肯定会在对象 2 的构造函数之前被调用(至少如果对象是在循环中声明的)。

在我的程序中,我想确保在创建新对象之前删除旧对象。除了在 for 循环末尾显式删除 a 之外,还有其他可能性吗?

提前致谢。

最佳答案

第二个对象的创建发生在名称被重新绑定(bind)和第一个对象被释放之前。

  1. 第一个 A 被实例化。
  2. a 已绑定(bind)。
  3. 第二个 A 被实例化。
  4. a被反弹,第一个A被处理掉。
  5. 程序结束,第二个A被处理掉。

关于python - 在对象的第二次初始化时,为什么 __init__ 在 __del__ 之前被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5702944/

相关文章:

python ascii 到 unicode 转换

c# - OOP - 关于 DDD 的私有(private)字段或私有(private)属性 setter

c++ - 向多态对象添加行为

objective-c - 在 Swift 中,你可以将 nil 作为函数的输入传递吗?

python - 就地赋值和再次使用变量名赋值有什么区别?

python - 从python中的双变量正态采样

javascript - Python 中 Javascript 中的 ASCII 返回字符显示为换行符和 "unterminated string error"

python - 无法在 re.sub() repr 表达式的函数调用中使用 '\1' 反向引用捕获组

Python 结构问题 : Giving an 'engine' class to everything

Python类实例变量隔离