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 から導出されたクラス) におけるプロパティ属性を返します。