如何用@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
相关产品推荐
相关产品推荐

