随着 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
这有点笨重,但您可以使用描述符类来完成。 对于您的示例,它看起来像这样:
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)