如何在数据类上创建非字段实例级变量?

How to create a non-field instance-level variable on a dataclass?

如果我理解得很好,ClassVar 是一种在数据 class 上创建 class 变量的方法,该变量不会被视为字段。所以,例如:

@dataclass
class MyData:
    name: str
    age: int
    parent: ClassVar[Optional["MyData"]] = None

jake_data = MyData(name="Jake", age=34)

dataclasses.fields(jake_data) # This will output only two fields, as status is a ClassVar

但是如果我想在实例初始化后在实例级别修改parent,它不应该是ClassVar,因为PEP 526清楚地表明ClassVar 注释只应用于未在实例级别替换的变量。而且我不想将 parent 声明为具有默认值的字段,因为那样它将是... dataclass 字段!

对于上下文:我使用依赖于 dataclasses.fields 输出的库,这就是我希望它成为非字段变量的原因。

是否有一种 pythonic 和可读的方式来做到这一点?

只是不要注释它,并在 __post_init__ 中定义它,所以类似于:

@dataclass
class MyData:
    name: str
    age: int

    def __post_init__(self):
        self.parent = None
        # whatever else