以前の Python のクラスでは、メソッドとフィールド
を設定することはできましたが、プロパティーを設定す
ることは(特殊な方法を除いて)できませんでした。
プロパティーは、フィールドと同様の感覚で参照/代
入できるわけですが、代入過程を特殊メソッドでフック
することによってコントロールできます。
以前の Python では以下のような書き方をしました。
※クラス K のフィールド x へは、100 以下の数値のみ
代入・・・ 100 を超えたら、100 を代入。
class K:
def __setattr__(self,name,v):
if name == "x":
if v > 100:
v = 100
self.__dict__[name] = v
__setattr__ 組み込みメソッドは、全てのフィールド
への代入を管理するので、もし複数のフィールドを管理
するとすれば、この組み込みメソッドを果てしなく拡張
する必要が出てきます。
property 型は、もうすこし柔軟に対応できます。
class K(object):
def __init__(self):
self.__x = 0
def getx(self):
return self.__x
def setx(self,value):
if value > 100:
value = 100
self.__x = value
x = property(getx,setx)
>>> k = K()
>>> k.x = 200
>>> print k.x
100
>>> k.x = 55
>>> print k.x
55
>>>
注意すべきポイントは、親クラスに object を設定す
ることです。
これを忘れると、思ったとおりの効果は現れません。
ただ、現在 object 関係は整理されているため、object
型からの継承はいずれ必要なくなるかもしれませんが、ver
2.3.3 現在はまだ必要です。
除算記号'/'やイテレータ、多国語本格対応など、Python
は時期メジャーバージョンの 3.x にむけて大改変が行わ
れています。
基本的な部分の変更は、非常に痛みを伴うので、なん
とか ver.3 あたりで安定した文法が確立されることを願
いたいものです。
/機械伯爵/