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

为什么Python允许类无__new__方法,却要求必须定义__init__方法?

关于Python中__new__和__init__的常见误解与解析

首先纠正一个核心误解:Python根本不要求类必须定义__init__方法。你完全可以写一个空类,直接实例化出对象:

class A:
    pass

obj = A()
print(obj)  # 输出类似 <__main__.A object at 0x7f8b9c03d190>

你示例里定义__init__只是给实例做了初始化操作,这是可选的,不是强制要求。

为什么不定义__new__也能创建实例?

所有Python类默认继承自object,而object类已经实现了__new__方法。当你调用A()时,Python的执行流程是:

  1. 先调用object.__new__(A),这个方法负责分配内存、创建A类的实例对象;
  2. 如果A类定义了__init__,就会把刚创建的实例作为第一个参数(self)传入__init__,执行初始化逻辑;
  3. 最后返回这个实例。

所以你没写__new__的时候,是在用父类(object)的默认实现,不是没有执行__new__。

__new__的存在意义是什么?

__new__是Python的构造方法(负责创建实例),__init__是初始化方法(负责给创建好的实例赋值),二者分工不同。__new__的核心作用场景包括:

  • 定制不可变类型的创建:像int、str、tuple这类不可变类型,实例创建后就无法修改属性,所以要在创建阶段做定制就得重写__new__。比如实现一个只能生成偶数的整数子类:

    class EvenInt(int):
        def __new__(cls, value):
            # 把输入值调整为最近的偶数后再创建实例
            adjusted_val = value if value % 2 == 0 else value + 1
            return super().__new__(cls, adjusted_val)
    
    num = EvenInt(5)
    print(num)  # 输出6
    
  • 实现单例模式:控制一个类只能生成唯一实例,通过在__new__里判断实例是否已存在来实现:

    class Singleton:
        _instance = None
        def __new__(cls):
            if cls._instance is None:
                cls._instance = super().__new__(cls)
            return cls._instance
    
    obj1 = Singleton()
    obj2 = Singleton()
    print(obj1 is obj2)  # 输出True,说明是同一个实例
    
  • 修改子类的实例创建逻辑:当子类继承的父类有特殊的实例创建逻辑时,重写__new__可以调整实例的生成过程,比如自定义一个基于内置容器类的子类,在创建时就过滤掉无效数据。

回到你的示例代码,调用A()时,object.__new__帮你创建了A的实例,然后A.__init__执行了打印操作,所以最终能得到实例并输出"hello world"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:42:27