为何属性名与类名相同时,联合类型加默认值会触发错误?
问题原因解析
- 核心问题出在类体作用域的变量解析顺序和同名标识符冲突:
- Python类定义时,类体是逐行执行的代码块。当执行到
A: A | None = None时,左侧的属性名A会被提前加入类B的命名空间,初始值为None(此时赋值操作还未完成)。 - 解析类型注解里的
A | None时,Python会优先在当前类B的命名空间中查找A,而非外部定义的类A。此时找到的A是刚创建的类属性,值为None,注解表达式就变成了None | None——而NoneType不支持|运算符,因此触发TypeError。
- Python类定义时,类体是逐行执行的代码块。当执行到
- 当把类
A重命名为其他名称后,类B的属性名和外部类名不再冲突,解析注解时会正确找到外部类,自然不会报错。
可以用这段代码验证上述逻辑:
class A: pass class B: print(f"类体中当前A的值: {A}") A: A | None = None
运行后会输出类体中当前A的值: None,直接证明注解解析前,类B的属性A已经是None了。
内容的提问来源于stack exchange,提问作者tibbe
相关产品推荐
相关产品推荐

