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

子类化str时__init__方法报错,子类化list却正常,原因何在?

子类化str报错的原因及解决方案

可变与不可变类型的初始化差异

  • list(可变类型):其__init__方法原生支持接收可迭代参数来初始化列表内容,因此子类中调用super().__init__(l)能正常触发父类逻辑,完成元素填充,所以你的ListSubClass能正常运行。
  • str(不可变类型):不可变类型的实例创建逻辑完全在__new__方法中实现,str本身没有自定义__init__,它的__init__直接继承自object。而object.__init__仅接受self一个参数,不允许传入额外参数,这就是你调用super().__init__(s)时触发TypeError的根本原因——此时实际调用的是object.__init__而非你预期的str.__init__。

正确的str子类实现方式

子类化str需要重写__new__方法(负责实例创建),而非__init__:

class StrSubClass(str):
    def __new__(cls, s):
        return super().__new__(cls, s)

测试调用:

>>> StrSubClass("foobar")
'foobar'

扩展:子类初始化时的额外操作

如果需要在子类初始化时修改字符串内容,同样要在__new__中完成(因为不可变实例创建后无法修改):

class PrefixedStr(str):
    def __new__(cls, s):
        modified_content = f"[{s}]"
        return super().__new__(cls, modified_content)

调用示例:

>>> PrefixedStr("hello")
'[hello]'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:13:22