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

