« Delphiのメソッドをメソッド名から実行する方法 | メイン | 作家のつながりを視覚的に表現したビーケーワンの「作家マップ」 »

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 組み込み関数

トラックバック

このエントリーのトラックバックURL:
http://www.gesource.jp/mt/mt-tb.cgi/965

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2009年05月12日 23:37に投稿されたエントリーのページです。

ひとつ前の投稿は「Delphiのメソッドをメソッド名から実行する方法」です。

次の投稿は「作家のつながりを視覚的に表現したビーケーワンの「作家マップ」」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35