class Freezable: _frozen: bool = False def freeze(self): if not self._frozen: self._frozen = True def __setattr__(self, *args, **kwargs): if self._frozen: raise Exception("cannot modify frozen object") super().__setattr__(*args, **kwargs)