如何使用attrs库在类中定义并访问类变量?
如何使用attrs库在类中定义并访问类变量?
嘿,刚好碰到过类似的问题!你遇到的报错其实是因为attrs库的设计就是会忽略带typing.ClassVar标注的属性,官方文档里也明确说了:
Attributes annotated as typing.ClassVar, and attributes that are neither annotated nor set to an field() are ignored.
那要在attrs装饰的类里定义类变量其实很简单——直接像普通Python类那样,把类变量放在类的顶层,不用把它作为attrs要处理的实例字段就行!
给你改一下原来的代码,就能正常工作了:
from typing import ClassVar, Final from attrs import define @define class Person: # 这些是attrs处理的实例变量 name: Final[str] age: Final[int] goes_to_school: Final[bool] # 直接定义类变量,不用让attrs处理它 my_class_var: ClassVar[str] = "Springfield Elementary" # 类变量属于类本身,推荐通过类来访问 print(Person.my_class_var) # 输出: Springfield Elementary p = Person('Bart Simpson', 10, True) # 实例也能访问类变量,但更规范的写法还是用类名访问 print(p.my_class_var) # 同样能输出正确内容
要是你想让类变量不可修改,还可以结合Final和ClassVar一起标注,静态类型检查工具(比如mypy)就会帮你管控:
my_class_var: Final[ClassVar[str]] = "Springfield Elementary"
这样就完美兼顾attrs的实例变量写法和Python原生的类变量需求啦~
备注:内容来源于stack exchange,提问作者mcocdawc
相关产品推荐
相关产品推荐

