向数据类 repr/init 公开属性 setter/getter

问题描述 投票:0回答:1

随着 python 数据类的引入,您可以在类上声明您的字段,它们默认会显示在

__init__
上,您可以使用
field()
进行自定义。

是否有一种干净的方法将属性设置器添加到将显示在

__init__
中的事物列表中?以及
__repr__
中显示的事物列表的 getter?

@dataclass
class Foo:
    _a: int = field(init=False, repr=False)

    @property
    def a(self):
        return self._a

    @a.setter
    def a(self, value):
        self._a = value
python python-dataclasses
1个回答
0
投票

这有点笨重,但您可以使用描述符类来完成。 对于您的示例,它看起来像这样:

class ADescriptor:

    def __get__(self, obj, class_owner):
        return obj._a

    def __set__(self, obj, value):
        obj._a = value

@dataclass
class Foo:
    _a: int = field(init=False, repr=False)
    a: ADescriptor= field(default=ADescriptor(), init=False)

显然,一个属性需要做很多工作,但如果您使用相同的模式,则可以概括描述符。

class MyRWDescriptor: 
    def __init__(self, attrib_name:str):
        self.attrib = attrib_name

    def __get__(self, obj:"Foo", class_owner:type):
        return getattr(obj, self.attrib)

    def __set__(self, obj:"Foo", value):
        setattr(obj, self.attrib, value)

@dataclass
class Foo:
    _a: int = field(init=False, repr=False)
    _z: str = field(init=False, repr=False)
    a: MyRWDescriptor= field(default=MyRWDescriptor('_a'), init=False)
    z: MyRWDescriptor= field(default=MyRWDescriptor('_z'), init=False)
© www.soinside.com 2019 - 2024. All rights reserved.