如何冻结非冻结数据类的单个字段?

Dav*_*oty 10 python python-dataclasses

是否可以指定在非冻结数据类中冻结单个字段?像这样的东西:

@dataclass
class Data:
    fixed: int = field(frozen=True)
    mutable: int = field(frozen=False)

d = Data(2, 3)
d.mutable = 5   # fine
d.fixed = 7     # raises exception
Run Code Online (Sandbox Code Playgroud)

我意识到这可以通过访问私有数据字段的属性和设置器手动完成,但是这样我们就失去了数据类的一些优点:首先,私有数据字段需要不同的名称,这意味着自动生成的构造函数令人烦恼地具有不同的名称参数名称比字段更重要。

Dio*_*ogo 8

我来这里寻找相同的东西,但是,就像 @wim 在评论中所说,dataclass不支持这一点,但使用attrs它是可能的:

from attrs import define, field
from attrs.setters import frozen

@define
class Data:
    fixed: int = field(on_setattr=frozen)
    mutable: int

d = Data(2, 3)
d.mutable = 5   # fine
d.fixed = 7     # raises exception
Run Code Online (Sandbox Code Playgroud)