Поэтому для контекста мы рассматриваем только классы данных и не используем сеттеры и геттеры с декораторами, вместо этого мы пишем их так:
Скажем, у нас есть класс. Пример:
Код: Выделить всё
from dataclasses import dataclass, InitVar, field
@dataclass
class Example:
'''
Invariant: attr > 0
'''
attr: InitVar[int]
__attr: int = field(init=False)
def __post_init__(self, attr: int) -> None:
self.set_attr(attr)
def get_attr(self) -> int:
return self.__attr
def set_attr(self, attr: int) -> None:
assert attr > 0, "Attribute should be positive"
self.__attr = attr
- Атрибуты изменяемы, поэтому можно написать методы _post_init_(), методы получения и установки, как я это сделал в примере выше.
- Атрибуты неизменяемы (frozen=True): в этом случае нам понадобится только метод _post_init_() и он будет проверять инвариант там.
- Атрибуты изменяемы, но мы хотим только читать, а не писать: нам нужен только _post_init_() и метод получения.
- Как это работает в случае 3? Проводится ли проверка в _post_init_() так же, как в случае 2?
- Что произойдет, если инварианта нет? Что нужно делать в _post_init_()?
- Есть ли еще какие-либо (базовые) случаи, которые я пропустил?
Любой добрый и знающий ответ будет очень ценю. Удачи!
Подробнее здесь: https://stackoverflow.com/questions/798 ... ataclasses
Мобильная версия