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を同時に書いている。
ここで、例えば

  1. readonlyなオブジェクト(super class)
  2. read, writeともに行えるオブジェクト(sub class)

というような感じのものを楽に書く方法が知りたい。

setterを定義するのには、定義したgetterのsetter attributeをデコレータとして渡せば良いのだけれど、superとかselfとか親のattributeへのアクセスをデコレータとして書く方法が分からない。
結論から言うと、..setterで良いっぽい。

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