Я хотел бы использовать @dataclass для удаления большого количества шаблонов, но мне также нравится инкапсуляция данных, предлагаемая @property. Могу ли я делать и то, и другое одновременно?
В качестве примера игрушки у меня есть такой класс, как
class Breakfast:
def __init__(self, sausage: str, eggs: str = "Scrambled", coffee: bool = False):
self._sausage = sausage
self._eggs = eggs
self._coffee = coffee
@property
def sausage(self):
return self._sausage
@property
def eggs(self):
return self._eggs
@property
def coffee(self):
return self._coffee
def __repr__(self):
...
def __eq__(self):
...
где у меня также могут быть сеттеры для некоторых свойств. Я бы хотел написать это в такой форме
@dataclass(property=True)
class DataBreakfast:
sausage: str
eggs: str = "Scrambled"
coffee: bool = False
(где, конечно, мой аргумент декоратора не работает), который будет выполнять все рутинные вещи, которые делает @dataclass, и по существу выводит код первого фрагмента. Затем я мог бы вручную добавить сеттеры в остальную часть тела на досуге.
Это кажется достаточно распространенным вариантом использования, но я не мог придумать, как заставить его работать. Замороженный параметр - самый близкий к тому, что я хочу, но на самом деле он не ведет себя как @property, поскольку он исключает какой-либо установщик.
frozen
или, если вы хотите, чтобы это было только в некоторых полях, _2 _. Если вы хотите пропустить запись@property
и иногда хотите добавить геттер, вам не повезло, потому что вы получите ошибку типа во время синтаксического анализа тела класса, даже до того, как декоратор класса данных получит применить свою логику. И если вы хотите добавить логику, такую как счетчик доступа, вам все равно придется написать свойство. - person Arne   schedule 17.05.2021@dataclass
тогда, а просто продолжу делать свои@property
вручную. Должен признаться, я немного удивлен, что это почти невозможное, я мог подумать, что то, чего я хотел, действительно было бы очень распространенным явлением. - person ScienceSnake   schedule 17.05.2021__repr__
, бесплатно. - person Arne   schedule 17.05.2021@dataclass(property=True)
? - person martineau   schedule 18.05.2021foo
, определенное в классе обычным@dataclass
способом, станет атрибутом_foo
и будет добавлен метод@property def foo(self): return self._foo
. Это также можно сделать вField
отдельно. Пользователь может свободно определять вручную любой@foo.setter
по своему усмотрению (если, возможно, не используется тегfrozen
). В этом есть смысл? Я не эксперт, но мне это не кажется особенно невыполнимым. - person ScienceSnake   schedule 18.05.2021@dataclass
. Ничего не происходит автоматически, и для этого нет дополнительных необязательных параметров для поля. Я взглянул на исходный код классов данных, но это выходит за рамки моей способности переваривать, не говоря уже о том, чтобы пытаться изменить. - person ScienceSnake   schedule 18.05.2021