Предположим, у меня есть класс данных:
Код: Выделить всё
@dataclass(frozen=True)
class Foo:
id: str
name: str
Я хочу, чтобы это было неизменным (следовательно, Foo.id = True), например, foo.id = bar и foo.name = baz не удалось. Но я хочу иметь возможность удалить идентификатор, вот так:
Код: Выделить всё
foo = Foo(id=10, name="spam")
foo.strip_id()
foo
-> Foo(id=None, name="spam")
Я попробовал несколько вещей, переопределив
setattr, но ничего не помогло. Есть ли элегантное решение этой проблемы? (Я знаю, что могу написать метод, который возвращает новый замороженный экземпляр, который будет идентичен, за исключением того, что этот идентификатор был удален, но это кажется немного хакерским, и для этого мне потребуется выполнить foo = foo.strip_id() , поскольку foo.strip_id() на самом деле не изменит foo)
Изменить:
Хотя некоторые комментаторы с этим не согласны, я думаю, что есть законное различие между «полностью изменяемым, делайте с ним все, что хотите» и «неизменяемым, за исключением этого конкретного, строго контролируемого способа»
Подробнее здесь:
https://stackoverflow.com/questions/606 ... via-method