重写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
相关产品推荐
相关产品推荐

