使用attrs库时,不给init=False的属性设默认值是否可行?
关于attrs库init=False字段不设默认值的可行性与最佳实践
这种写法完全可行,而且是符合attrs最佳实践的正确用法,理由如下:
attrs机制天然支持:当给字段设置
init=False时,attrs会跳过构造函数中对该字段的初始化流程,它只要求你在实例初始化的早期阶段(比如__attrs_post_init__)完成字段赋值。只要你在__attrs_post_init__里给字段赋值,就不会出现未初始化的问题,你的测试代码能正常运行就是最好的证明。代码逻辑更清晰:
init=False的字段本质是无需用户通过构造函数传入的内部属性,不指定默认值能明确传递信号——这个字段的取值由类内部逻辑生成,和用户输入无关,也不存在默认值的歧义。如果画蛇添足给个默认值再在__attrs_post_init__里覆盖,反而会让代码逻辑变得混乱冗余。符合类型安全要求:你给
val1标注了str类型,且在__attrs_post_init__中赋值了字符串,完全匹配类型注解,类型检查工具(如mypy)也不会报错。
注意事项
务必确保在__attrs_post_init__中给这类init=False且未设默认值的字段赋值,否则实例创建后访问该字段会触发AttributeError。如果字段是可选类型(比如str | None),可以考虑不赋值,但必填类型一定要在初始化后完成赋值。
你的示例代码就是标准的正确写法:
import attrs @attrs.define class MyClass: val1: str = attrs.field(init=False) def __attrs_post_init__(self): self.val1="something" a = MyClass() print(a) # 输出: MyClass(val1='something') print(a.val1) # 输出: something
内容的提问来源于stack exchange,提问作者Floh
相关产品推荐
相关产品推荐

