为什么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的执行流程是:
- 先调用
object.__new__(A),这个方法负责分配内存、创建A类的实例对象; - 如果A类定义了
__init__,就会把刚创建的实例作为第一个参数(self)传入__init__,执行初始化逻辑; - 最后返回这个实例。
所以你没写__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
相关产品推荐
相关产品推荐

