Python的__new__魔法方法中cls参数的作用是什么?
问题解答
核心执行逻辑说明
Python中调用类名()创建实例时,内置执行流程严格遵循以下规则:
- 优先调用该类的
__new__方法,自动将当前类作为第一个参数cls传入,__new__负责分配内存、创建空实例并返回 - 仅当
__new__返回的实例是cls(即你调用的那个类)本身或其子类的实例时,Python才会自动调用该类的__init__方法,将返回的实例作为self传入完成初始化。如果返回的实例不属于cls的实例体系,会直接跳过所有__init__的自动调用。
你遇到的问题原因
你的代码中B类的__new__方法返回的是A类的实例,不属于B类的实例体系,因此触发了规则2的跳过逻辑:
- 不会自动调用
B.__init__:因为返回的实例不是B的实例 - 也不会自动调用
A.__init__:因为你是通过B()触发的实例化流程,Python只会检查返回值是否匹配你调用的类(即B),不会主动识别返回实例的所属类去调用对应__init__
__new__中cls参数的作用
cls是Python调用__new__时自动传入的参数,核心作用有两个:
- 标识当前实例化流程对应的主类,作为后续是否自动调用
__init__的判断依据 - 作为参数传给父类
__new__方法,告知父类要创建的是哪个类的实例,保证返回的实例类型符合预期
验证方案
你可以通过两种修改验证以上逻辑:
- 调整返回实例类型,触发自动
__init__调用:
class B: def __new__(cls): print('B.__new__') # 返回B类的实例,触发B.__init__自动调用 return super().__new__(cls) def __init__(self): print('B.__init__') self.b =30
- 手动调用其他类的
__init__完成初始化:
class B: def __new__(cls): print('B.__new__') obj = super().__new__(A) # 手动触发A的初始化方法 obj.__init__() return obj
内容的提问来源于stack exchange,提问作者Xhhhhh
相关产品推荐
相关产品推荐

