class Immutable ( object ): """An immutable class. """ _mutable = False def __setattr__ ( self , name , value ): if self . _mutable or name == '_mutable' : super ( Immutable , self ) . __setattr__ ( name , value ) else : raise TypeError ( "Can't modify immutable instance" ) def __delattr__ ( self , name ): if self . _mutable : super ( Immutable , self ) . __delattr__ ( name ) else : raise TypeError ( "Can't modify immutable instance" ) def mutablemethod ( f ): def func ( self , * args , ** kwargs ): if isinstance ( self , Immutable ): old_mutable = self . _mutable self . _mutable = True res = f ( self , * args , ** kwargs ) self . _mutable = old_mutable else : res = f ( self , * args , ** kwargs ) return res return func if __name__ == '__main__' : class A ( Immutable ): ''' Define __init__ can set attributes for instance ''' @mutablemethod def __init__ ( self , value ): super ( A , self ) . __init__ ( self ) self . value = value def try_change ( self , value ): self . value = value a = A ( "test" ) a . try_change ( "TEST" ) a . value = "TEST"