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

Python中dataclass能否实现构造函数可设、后续只读的字段x?

在Python dataclasses中实现构造后只读的字段

当然可以实现,这里提供两种实用方案:

方案1:使用dataclass的frozen=True参数

这是最简单的方式,直接让整个类变为不可变,所有字段构造后都无法修改:

from dataclasses import dataclass

@dataclass(frozen=True)
class A:
    x: int

a = A(x=4)
print(a.x)  # 输出4
a.x = 4  # 抛出AttributeError: cannot assign to field 'x'

优缺点:

  • 优点:无需额外代码,利用dataclass原生功能,自动生成的构造函数、__repr__等方法依然可用。
  • 缺点:整个类的所有字段都会变成只读,如果需要修改其他字段,这个方案不适用。

方案2:结合私有变量与@property实现单个字段只读

如果只需要指定字段只读,其他字段可修改,可以用私有变量存储值,通过@property提供只读访问:

from dataclasses import dataclass

@dataclass(init=False)
class A:
    # 其他可修改字段示例
    y: int

    def __init__(self, x: int, y: int):
        self._x = x
        self.y = y

    @property
    def x(self):
        return self._x

# 使用示例
a = A(x=4, y=10)
print(a.x)  # 输出4
print(a.y)  # 输出10

a.y = 20  # 正常修改
print(a.y)  # 输出20

a.x = 5  # 抛出AttributeError: can't set attribute

优缺点:

  • 优点:精准控制单个字段的只读属性,其他字段不受影响。
  • 缺点:需要手动编写__init__方法,失去dataclass自动生成构造函数的便利。

内容的提问来源于stack exchange,提问作者Gabriel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:25:28