Ну, вы можете сделать это, , непосредственно изменив __dict__
член экземпляра , изменив атрибут с помощью object.__setattr__(...)
1 , но почему ??? Спрашивать конкретно о неизменяемом , а затем сделать его изменчивым ... нерешительно. Но если вы должны:
from dataclasses import dataclass
@dataclass(frozen=True)
class Foo:
id: str
name: str
def strip_id(self):
object.__setattr__(self, 'id', None)
foo=Foo(10, 'bar')
>>> foo
Foo(id=10, name='bar')
>>> foo.strip_id()
>>> foo
Foo(id=None, name='bar')
Любой способ сделать это, вероятно, покажется хакерским ... потому что он требует выполнения действий, которые в корне противоположны замыслу.
Если вы Вы используете это как сигнал другим программистам, что им не следует изменять значения, способ, который обычно делается в Python, заключается в добавлении префикса имени переменной с одним подчеркиванием. Если вы хотите сделать это, в то же время делая доступными значения, возможно, будет работать что-то вроде этого:
from dataclasses import dataclass
@dataclass
class Foo:
_id: str
_name: str
def strip_id(self):
self.__dict__['id'] = None
def get_id(self):
return self._id
1: Изменено согласно ответу @Arne, который заметил, что внутреннее использование словаря в качестве контейнера данных не гарантируется.