如何在变量之间具有依赖关系的python数据类中实现封装

如何在变量之间具有依赖关系的python数据类中实现封装,python,python-3.x,oop,encapsulation,python-dataclasses,Python,Python 3.x,Oop,Encapsulation,Python Dataclasses,我最近了解了数据类在编写主要用作数据容器的类时减少样板代码的好处 我希望能够使用DataClass,但希望保持我已经习惯于使用私有/受保护变量和/或属性的常规类的封装级别 我希望能够封装两个字段,以便它们只能根据一些预期规则一起更新 作为最起码的例子: 类封装类: 定义初始化(self,field1,field2): 验证参数(字段1、字段2) self.\u field1=field1 self.\u field2=field2 def更新_字段(self、arg1、arg2): 如果arg1

我最近了解了数据类在编写主要用作数据容器的类时减少样板代码的好处

我希望能够使用DataClass,但希望保持我已经习惯于使用私有/受保护变量和/或属性的常规类的封装级别

我希望能够封装两个字段,以便它们只能根据一些预期规则一起更新

作为最起码的例子:

类封装类:
定义初始化(self,field1,field2):
验证参数(字段1、字段2)
self.\u field1=field1
self.\u field2=field2
def更新_字段(self、arg1、arg2):
如果arg1:
自。_字段1+=1
如果arg2:
自。_字段2+=1
如果arg1和arg2:
自。_字段1=0
我之所以喜欢这种行为,是因为它可以保证(直到用户修改受保护的参数)field1和field2具有某种预期的关系,这可以在初始化时验证,然后再也不需要验证

然而,对于一个标准类,我需要实现
\uuuueq\uuuu
\uurepr\uuuu
\uuuu init\uuuu
,为了简化样板文件,我宁愿避免这些


有没有一种方法可以通过使用具有最少样板文件的数据类来实现这种行为?

一般来说,没有。但是,根据您正试图执行的操作,可能有各种特定的解决方法。例如,这里我可以创建一个对元组进行操作的属性

class EncapsulatedClass:
    def __init__(self, field1, field2):
        self.field = (field1, field2)

    @property
    def field(self):
        return (self._field1, self._field2)

    @field.setter
    def field(self, value):
        v1, v2 = value  # Here, just letting a possible exception propogate
        if v1:
            self._field1 += 1
        if v2:
            self._field2 += 1
        if v1 and v2:
            self._field1 = 0

    # Now it's a wrapper around the setter
    def update_fields(self, field1, field2):
        self.field = (field1, field2)
您可以继续在dataclass中使用属性<代码>\uuuu post\u init\uuuuu可以定义为初始化属性,而无需重新强制执行将使用底层属性的所有内容

@dataclass
class EncapsulatedClass:
    _field1: int
    _field2: int

    def __post_init__(self):
        self.field = (self._field1, self._field2)
        
    @property
    def field(self):
        return (self._field1, self._field2)

    @field.setter
    def field(self, value):
        v1, v2 = value  # Here, just letting a possible exception propogate
        if v1:
            self._field1 += 1
        if v2:
            self._field2 += 1
        if v1 and v2:
            self._field1 = 0

    def update_fields(self, field1, field2):
        self.field = (field1, field2)

确认在一般情况下没有解决方案是有用的,并且将依赖字段打包到元组中是一种有趣的方法,在我的情况下是有效的,谢谢!