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

