You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python测试__new__/__init__/__del__时析构函数多次调用原因咨询

析构函数两次调用的根本原因

出现两次__del__调用,是因为你的__new__方法一共创建了2个独立的Example类实例,而非1个:

  • 第一次实例创建发生在print语句内:你在写print("example created", object.__new__(cls))的时候,就已经调用object.__new__(cls)生成了第一个实例。这个实例没有被任何变量引用,也不会被传入__init__执行初始化,print执行完后它的引用计数直接降为0,会立刻触发第一次析构。
  • 第二次实例创建发生在return语句内:你在return时又写了一次object.__new__(cls),这是全新的第二个实例。这个实例会作为__new__的返回值,传给__init__完成初始化,最终绑定到变量obj上。当你手动执行del obj时,这个实例的引用计数降为0,触发第二次析构。
正确写法

要让实例创建、初始化、析构的流程符合预期(各执行一次),只需要保证__new__里只调用一次实例创建逻辑,把生成的实例暂存后复用即可:

class Example:
    # 创建实例
    def __new__(cls):
        instance = object.__new__(cls)
        print("example created", instance)
        return instance

    # 初始化实例
    def __init__(self):
        print("Example Instance.")

    # 析构函数
    def __del__(self):
        print("Destructor called, Example deleted.")

obj = Example()
del obj

运行上述修正后的代码,输出顺序为:

example created <__main__.Example object at 0x内存地址>
Example Instance.
Destructor called, Example deleted.

析构函数只会触发一次。

内容的提问来源于stack exchange,提问作者PHarray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:39:34