You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:53:07