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

继承自list的自定义类执行加法运算后丢失类型的原因及解决方法

自定义list子类使用+运算符丢失类型问题解答

现象原因

  • 原生list的__add__方法在设计时就固定返回list类型的新实例,不会适配子类的类型。+运算符调用的就是__add__方法,执行拼接逻辑后会生成一个全新的原生列表对象,所以你得到的C会丢失MyList的自定义属性和方法。
  • 而+=运算符调用的是__iadd__方法,该方法的实现逻辑是直接在原对象上做扩展(等价于调用extend方法),不会生成新的对象,所以原对象的MyList类型会被保留,自定义方法可以正常调用。

解决方案

你只需要在自定义子类中重写__add__方法,让拼接后的结果返回MyList类型实例即可,参考实现如下:

class MyList(list):
    def func(self):
        print(self)
    
    def __add__(self, other):
        # 调用父类原生的拼接逻辑,将结果封装为MyList实例返回
        return MyList(super().__add__(other))
    
    # 可选补充:如果需要支持 other + MyList 形式的反向加法,可重写__radd__
    def __radd__(self, other):
        return MyList(other) + self

验证代码:

A = MyList([1,2,3])
B = MyList([4,5,6])
C = A + B
print(type(C)) # 输出 <class '__main__.MyList'>
C.func() # 可正常执行,输出 [1, 2, 3, 4, 5, 6]

如果后续需要用到列表乘法*等其他运算符,也可以用相同的逻辑重写对应的__mul__、__rmul__等魔术方法保证类型一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:45:02