propertyを使うにはobjectクラスを継承した新スタイルクラス(new-style class)でなければならない

Pythonのpropertyについて。

objectクラスを継承しない旧スタイルクラス(classic class)でpropertyを使った。

class Foo:
    def __init__(self):
        self.__x = 1
    def getx(self):
        return self.__x
    def setx(self, val):
        self.__x = val
    x = property(getx, setx)

foo = Foo()
print foo.x #=> 1
foo.x = 2
print foo.x #=> 2

一見してうまく動作しているように見える。
ところが、

foo = Foo()
print foo.x #=> 1
print foo.getx() #=> 1
foo.x = 2
print foo.x #=> 2
print foo.getx() #=> 1

と、self.__xは変更されていなかった。

objectクラスを継承した新スタイルクラス(new-style class)にすると、期待通りの動作になる。

class Bar(object):
    def __init__(self):
        self.__x = 1
    def getx(self):
        return self.__x
    def setx(self, val):
        self.__x = val
    x = property(getx, setx)

bar = Bar()
print bar.x #=> 1
print bar.getx() #=> 1
bar.x = 2
print bar.x #=> 2
print bar.getx() #=> 2

propertyを使うには、objectクラスを継承した新スタイルクラス(new-style class)でなければならないようだ。

Python ライブラリリファレンスにも、そのように記載されていました。

property([fget[, fset[, fdel[, doc]]]])
新しい形式のクラス (object から導出されたクラス) におけるプロパティ属性を返します。

Python ライブラリリファレンス 2.1 組み込み関数

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です