子类化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
相关产品推荐
相关产品推荐

