作者: 機械伯爵
日時: 2004/2/9(13:58)
 以前の 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 あたりで安定した文法が確立されることを願
いたいものです。

/機械伯爵/