[Python]Pythonでconstメソッドを使う

Python Developers Camp 2006s のライトニングトークでちらっと話したconstメソッド。
constメソッド内では、オブジェクトの状態が変わらないことを保証するということです。
C++くらいしかしらないのだけど、その他の言語にはないのだろうか。
んで、以下の感じ。
今回はdoctestをしてみました。
前半の三重引用符(""")で囲まれているところがdoctestです。

"""
>>> class Person (object):
...    def __init__(self, name):
...        self._name = name
...    @Const
...    def getname(self):
...        return self._name
...    name = property(getname)
...
>>> p = Person('aodag')
>>> p.name
'aodag'
>>> class Fail (object):
...    def __init__(self, name):
...        self._name = name
...        self.count = 0
...    @Const
...    def getname(self):
...       self.count += 1
...    name = property(getname)
...
>>> d = Fail('aodag')
>>> try:
...     d.name
... except:
...     print 'OK'
...
OK
"""
class ConstWrappedObject:
    def __init__(self, o):
        self.ConstWrappedObject_o = o

    def __setattr__(self, key, value):
        if key == 'ConstWrappedObject_o':
            self.__dict__[key] = value
        else:
            raise Exception()

    def __getattr__(self, key):
        if key == 'ConstWrappedObject_o':
            return self.__dict__[key]
        else:
            return getattr(self.__dict__['ConstWrappedObject_o'], key)

def Const(func):
    def wrappedFunc(self, *args, **kwargs):
        wrappedObject = ConstWrappedObject(self)
        return apply(func, (wrappedObject,)+args, kwargs)

    return wrappedFunc

if __name__ == '__main__':
    import doctest
    doctest.testmod()
    

基本的な考えはsetattrで例外を発生させるラッパオブジェクトに差し替えてから、メソッド本体を呼ぶ。
んでほんとーにsetattrを許さないようにすると元オブジェクトを保持できないので、その辺だけごちゃごちゃとやっています。