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

如何用@dataclass和@property构建Python类,使构造函数无双下划线参数?

Python类构造函数设计:私有属性、@property与@dataclass的选型

我需要构建一个后续会扩展功能的类,期望通过双下划线前缀将部分属性标记为*“私有”*,同时借助@property装饰器添加业务逻辑或控制属性的可见性,目标类的结构如下:

class Whatever:
    __attr1: int
    __attr2: str
    __attr3: list[str]

    @property
    def attr1(self) -> int:
       return self.__attr1

    @property
    def attr2(self) -> str:
        return self.__attr2

    @__attr2.setter
    def attr2(self, value: str) -> None:
        # 此处添加业务逻辑
        self.__attr2 = value

    def filtered_attr3(self, p1: str) -> list[str]:
        filtered: list[str]
        # 此处添加过滤逻辑
        return filtered

现在需要设计符合Python风格的构造函数,请问该如何实现?

我知道可以用@dataclass装饰器自动生成__init__方法,但存在问题:我试图隐藏的私有属性会被作为构造函数的参数暴露出来。看到有方案通过备份字段解决——重复声明不带双下划线前缀的属性,并用typing.field设置参数:

# 示例片段
attr1: int
__attr1 = field(init=False, repr=False)

但这种方式会增加冗余代码,违背了我想省去手写__init__的初衷。目前没找到能满足所有需求的替代方案,想请教以下哪种方案更优:

  • @dataclass + 双下划线私有属性(__attr) + @property
  • @dataclass + 普通属性(attr,替代__attr) + @property
  • 手写__init__ + 双下划线私有属性(__attr) + @property
  • 仅手写__init__,舍弃@property和私有属性标记
  • 其他未提及的方案?

我个人初步认为,最佳方案可能是保留类型注解但舍弃双下划线的“私有”属性标记,因为@property装饰的方法会在直接访问属性前触发逻辑,同时构造函数的参数也不会带下划线,更符合使用习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:17:48