You need to enable JavaScript to run this app. 重写Python的__new__方法时如何复现类的原始实例化行为
优惠活动
大模型
产品
解决方案
定价
更多

重写Python的__new__方法时如何复现类的原始实例化行为

报错原因

你调用super().__new__(cls, coords_A, coords_B)时,Line默认继承的父类是object,而object.__new__方法仅接收cls这一个必传参数,多余的位置参数会直接触发TypeError。
Python实例创建流程中,只要__new__返回的是当前类的实例,传入类构造函数的参数会自动传递给__init__方法,不需要在调用__new__的时候额外传入。

修正后代码

class Point:
    def __init__(self, coords):
        self.coords = coords

class Line:
    def __new__(cls, coords_A, coords_B):
        if coords_A == coords_B:
            # 返回非Line类实例时,__init__不会自动执行,符合预期
            return Point(coords_A)
        # 复刻原始__new__行为,仅传cls参数即可
        return super().__new__(cls)
        
    def __init__(self, coords_A, coords_B):
        self.A = coords_A
        self.B = coords_B

验证效果

  • 调用Line(1, 1)会返回Point类实例,coords属性值为1
  • 调用Line(1, 2)会返回正常的Line类实例,A属性为1、B属性为2,无报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 00:06:01