关于PEP 526中类与实例变量注解的疑问及验证
PEP 526 类与实例变量注解的误解澄清
先明确核心规则:PEP 526 并没有改变 Python 原本的类/实例变量绑定逻辑——类体中带赋值的变量注解,本质依然是类变量,注解只是附加类型信息,不会把它变成实例变量。
你给出的代码示例:
class Foo: bar: int = 7 def __init__(self, bar): self.bar = bar
bar: int = 7这行是给类变量Foo.bar添加类型注解,同时完成赋值,所以直接访问Foo.bar会得到7,这是标准的类变量行为。__init__里的self.bar = bar是给实例创建了同名的实例变量,Python 属性查找时会优先读取实例自身的属性,所以f.bar返回3;而f.__class__.bar指向的还是类变量,所以返回7。
PEP 526 中所说的「实例变量注解」,特指仅写注解不赋值的场景,比如:
class Foo: bar: int # 仅标注实例变量的类型,不会创建类变量 def __init__(self, bar): self.bar = bar
这种情况下,Foo.bar会抛出AttributeError,因为没有定义类变量,bar仅作为实例变量的类型提示存在。
你觉得PEP表述不够清晰是合理的——那个示例同时混合了类变量赋值和实例变量的类型注解,容易让人误解注解会改变变量的作用域。但本质上,Python的变量绑定逻辑没有变,注解只是额外的元数据,不影响变量是类变量还是实例变量的本质。
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

