Python类成员类型注解是否会遮蔽已有或内置变量?
类类型注解中
id的遮蔽问题解析 是否存在遮蔽?
确实存在遮蔽,但和你理解的实例属性self.id不是一回事。
遮蔽的范围
遮蔽仅发生在类的命名空间内部,具体细节:
当你在类体中定义
id: int时,这个id会成为类的属性(即使只有类型注解、未赋值),它会占据类命名空间里的id名称,遮蔽全局作用域的内置id()函数。比如在类的方法内部直接调用
id(),此时会优先取类命名空间的id,而非内置函数:class SomeClass: id: int def test(self): print(id(self)) # 运行报错:TypeError: 'int' object is not callable这是因为此时
id指向类中定义的类型注解对应的名称,而非内置的可调用函数。而实例属性
self.id不会遮蔽内置id:无类型注解时,self.id是实例级属性,访问它需要通过self,直接调用id()时仍会取全局的内置函数,因此不会有冲突。
代码检查工具提示的原因
Ruff这类工具会检测类体中的名称是否遮蔽内置名称,因为类命名空间的id会给类内部直接使用id的场景埋下隐患——哪怕当前代码没用到,后续维护时如果在类方法里直接调用id(),就会触发错误。
内容的提问来源于stack exchange,提问作者Nikolai Prokoschenko
相关产品推荐
相关产品推荐

