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

子类化str时如何声明额外属性?解决mypy属性未定义报错

解决方法

要让mypy识别StrWithInt类的value属性,需在类级别显式声明该属性的类型注解。因为str是不可变类型,实例通过__new__创建,动态添加的属性无法被静态类型检查器自动识别,必须提前声明。

修改后的代码

class StrWithInt(str):
    value: int  # 显式声明属性类型

    def __new__(cls, content: str, value: int):
        ret = super().__new__(cls, content)
        ret.value = value
        return ret

    def __init__(self, *args, **kwargs):
        # 重写__init__避免父类str的__init__因参数不匹配报错
        pass

关键说明

  • 类级别类型声明:value: int明确告知mypy,StrWithInt的所有实例都包含一个int类型的value属性,直接消除静态检查时的attr-defined错误。
  • 处理__init__参数问题:调用StrWithInt(content, value)时,Python会在__new__返回实例后自动调用__init__,而父类str的__init__仅接受字符串参数。重写__init__并忽略额外参数,可避免原代码潜在的运行时参数不匹配错误。

若你的场景中不会触发__init__的参数问题,也可以仅添加类级别的属性声明,保留原__new__实现即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:25:28