Python.use(better) #OOP:状態〔state〕
‖記事一覧‖ Python.use(better)《Python3.1》
OOP:状態〔state〕
オブジェクト指向プログラミング〔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