immutable_types = set((int, str)) class Frozen(object): def __init__(self, value): self._value = value def __getattribute__(self, name): if name == '_value': return super(Frozen, self).__getattribute__(name) v = getattr(self._value, name) return v if v.__class__ in immutable_types else freeze(v) def __setattr__(self, name, value): if name == '_value': super(Frozen, self).__setattr__(name, value) else: raise Exception("Can't modify frozen object {0}".format(self._value)) def freeze(value): return Frozen(value)