[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を許さないようにすると元オブジェクトを保持できないので、その辺だけごちゃごちゃとやっています。