Python.use(better) #OOP:状態〔state〕

記事一覧 Python.use(better)《Python3.1》《復刻版》

OOP:状態〔state〕

《著》真樹育未、小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第1版♪1988/05/23 ● 第2版♪2001/01/29 ● 第3版♪2009/12/15

オブジェクト指向プログラミング〔OOP〕の基本概念の理解を深めます。
※ Python1.5 で作成した例題を、Python3.1 で再構成しました。

オブジェクトの3要素

オブジェクトを特徴付ける3要素として、

  • 識別性〔identity〕
  • 状態〔state〕
  • 振舞〔behavior〕

が挙げられます。

■ 状態

状態は、あるオブジェクトの特性と、その特性の現在の値によって確定します。

一例として、スタックの状態(空かどうか)について考えます。スタックへの有効な操作は push/pop です。push 操作で積まれた物は、pop 操作で降ろされます。ただし、スタックの状態が空のとき、pop 操作は無効です。このように、オブジェクトの状態によっては、同じ操作が有効にも無効にもなります。つまり、あるオブジェクトの現在の状態は、過去の操作を累積したものと考えられます。そのため、あるオブジェクトの振舞は、一連の操作を過去に遡った履歴に影響を受けます。

■ 事例1:座標

ある点の座標を表現する、クラス Point を定義します。

>>> class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y


>>> Point; id(Point)

4770592

クラスもオブジェクトなので、他のオブジェクトと同様に、固有の識別子 4770592 を持ちます。そこで、クラス Point に属する、2つの異なる点(インスタンス)を生成して、どこに違いがあるかを確認します。

>>> p1 = Point(3, 4)
>>> p2 = Point(3, 5)

ここで、各点 p1,p2 に共通する属性 x,y に着目します。x 座標は同じ値ですが、y 座標は異なります。では、その値を表わす整数オブジェクトは、同一でしょうか。

>>> id(p1.x); id(p1.y)
3483808
3483824
>>> id(p2.x); id(p2.y)
3483808
3483840


2点 p1, p2 において、y 座標を表わすインスタンス属性 .y を参照すると、異なるオブジェクトが得られます。ところが、x 座標を表わすインスタンス属性 .x を参照すると、同じオブジェクトが得られます。つまり、同じ値というだけではなく、実際に同じオブジェクトを共有します。そこで、各インスタンスの識別性を確認すると、

>>> id(p1); id(p2)
19193296
19191408

p1,p2 は、異なる点(座標)を表わすインスタンスであり、実際に異なるオブジェクトなのが分かります。

■ 事例2:

座標値が変わると、そのオブジェクトの状態が変化したものと見なされます。

>>> p1.y = 5
>>> id(p1.y)
3483840
>>> p1.y is p2.y
True


p1,p2 は、同じ点(座標)を表わすインスタンスですが、実際には異なるオブジェクトなのが分かります。例えば、2点 p1, p2 が図形を構成する要素なら、2つの図形はその点で交わること(交点)になります。

■ 状態が変化するということ

属性値が変化するというのは、属性変数があるオブジェクトの束縛を解いて、別のオブジェクトを再束縛することです。属性変化とは、新たな束縛が形成されることに他なりません。これは、オブジェクトの状態が変化したことを意味します。

》こちらに移動中です《
TOP


関連記事

Last updated♪2009/12/23