propertyの継承(getterのみ -> getter,setter両方提供)
propertyは以下のような感じで使える。
例えば、渡された数値を整数値として扱いたいようなオブジェクトの例。
class Obj(object): def __init__(self): self._n = None @property def n(self): return self._n @n.setter def n(self, v): self._n = abs(v) obj = Obj() obj.n = -200 print obj.n # >> 200
この例では、getterとsetterを同時に書いている。
ここで、例えば
- readonlyなオブジェクト(super class)
- read, writeともに行えるオブジェクト(sub class)
というような感じのものを楽に書く方法が知りたい。
setterを定義するのには、定義したgetterのsetter attributeをデコレータとして渡せば良いのだけれど、superとかselfとか親のattributeへのアクセスをデコレータとして書く方法が分からない。
結論から言うと、
class ReadOnly(object): def __init__(self, n): self._n = abs(n) @property def n(self): return self._n print ReadOnly(-20).n class EnableReadWrite(ReadOnly): @ReadOnly.n.setter def n(self, v): self._n = abs(v) ro = ReadOnly(-20) print ro.n #>> 20 # ro.n = -200 #>> AttributeError: can't set attribute rw = EnableReadWrite(-30) print rw.n rw.n = -300 print rw.n #>> 30 #>> 300