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

Python类内访问实例变量报错:__new__定义属性、PyCharm警告及类属性异常修改问题

问题1解答:PyCharm未解析属性警告原因
  • 核心原因是PyCharm的静态类型检测逻辑优先读取.pyi存根文件的定义,且默认只会从__init__方法中扫描实例属性的初始化逻辑。你覆写了__new__方法做实例属性赋值,且存根文件中没有声明_value、_scalar这两个实例属性,所以静态检测识别不到这两个属性的存在。
  • 你给self加上SquareRoot类型提示后,相当于手动告诉IDE这个实例一定存在对应属性,警告自然消失。
  • 修复方案:
    1. 在存根文件的SquareRoot类中直接声明实例属性注解,比如添加_value: int、_scalar: int(根据你实际的属性类型调整即可)
    2. 若不需要存根文件,也可以直接在.py文件的SquareRoot类头部加上述属性注解,不需要赋值,仅做类型声明就可以被PyCharm识别。
问题2解答:修改类属性影响实例取值的原因
  • 这个表现不符合你预期的正常逻辑,正常情况下在__new__中给实例赋值的self._value是实例独有的属性,修改类级别的SquareRoot._value不会对已创建的实例产生影响,出现你描述的现象只有两种可能:
    1. 你测试用的实例x在创建时,__new__方法走了非标准返回路径,没有给实例成功赋值_value属性。当实例本身的属性字典__dict__中找不到_value时,Python会自动回溯查找类命名空间下的同名属性,就会出现修改类属性同步影响实例取值的现象。
    2. 你的__str__/__repr__方法实现错误,内部读取的是SquareRoot._value而不是self._value,导致打印时永远读取类属性的值。
  • 排查方法:执行print(x.__dict__),如果输出中没有_value键,说明是第一种原因;如果有_value且值为2,说明是第二种原因,修改对应方法的取值逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:36:02