【问题标题】:Dataclass attributes with init=False do not show in varsinit=False 的数据类属性不显示在 vars 中
【发布时间】:2026-02-24 08:55:01
【问题描述】:

我正在运行 Python 3.8.10 并且有一个具有一些属性的数据类。其中一些具有默认值,但不是构造函数的一部分。

init 值设置为 False 的属性不会显示在对象字典中。

这是预期的行为吗?如何强制这些属性显示在 vars 中?

from dataclasses import dataclass, field


@dataclass
class Book:
    name: str = field(default="", init=False)
    author: str = field(default="", init=True)


b = Book()
b
> Book(name='', author='')

b.name
> ''

b.author
> ''

## name does not show up here
vars(b)
> {'author': ''}

b.__dict__
> {'author': ''}

【问题讨论】:

    标签: python-dataclasses


    【解决方案1】:

    我刚刚遇到了同样的问题。一些实验表明,这些变量在设置后会显示在 vars 中。

    我在__post_init__() 中添加了以下内容,然后它们出现在 vars 中

      def __post_init__(self):
        for field in dataclasses.fields(self):
          #Ensure that all dataclass fields show up in vars
          if field.name not in vars(self):
            setattr(self, field.name, getattr(self, field.name))
    

    文档还提到了使用 init=False 的其他一些奇怪之处。 https://docs.python.org/3/library/dataclasses.html#dataclasses.replace

    预先警告 init=False 字段在调用期间如何工作 代替()。它们不是从源对象复制的,而是 在 post_init() 中初始化,如果它们被初始化的话。它是 预计 init=False 字段将很少且明智地使用。

    我认为,当涉及到这个功能时,一定要检查你的假设。

    【讨论】: