propertyが使えないだと!?

Pythonでpropertyを使ってみようと思って、大いにハマったのでメモ。

class Class:
    def __init__(self, a):
        self._a = a

    def get_a(self):
        return self._a

    def set_a(self, v):
        if v < 20:
            self._a = v
        else:
            print "ERROR"

    a = property(get_a, set_a)

if __name__ == "__main__":
    c = Classes(10)
    c.a = 100
    print c.a

propertyのテストでお馴染のコードだが、何故か出力が100になる。set_aが呼ばれてないのである。

ここでobjectを継承する。

class Class(object):
    def __init__(self, a):
        self._a = a

    def get_a(self):
        return self._a

    def set_a(self, v):
        if v < 20:
            self._a = v
        else:
            print "ERROR"

    a = property(get_a, set_a)

if __name__ == "__main__":
    c = Classes(10)
    c.a = 100
    print c.a

こうするとちゃんとERRORが出力され、10が出力される。

setterを呼ぶには何故かobjectの継承が必要だよ、という話だが、原因が良く分からない。基本的な所な気がするので後で調べる。