Python.use(better) #OOP:状態〔state〕
‖記事一覧‖ Python.use(better)《Python3.1》《復刻版》
OOP:状態〔state〕
オブジェクト指向プログラミング〔OOP〕の基本概念の理解を深めます。
※ Python1.5 で作成した例題を、Python3.1 で再構成しました。
オブジェクトの3要素
オブジェクトを特徴付ける3要素として、
- 識別性〔identity〕
- 状態〔state〕
- 振舞〔behavior〕
が挙げられます。
■ 事例2:Fraction
ある分数を表現する、クラス Fraction を取り込みます。
>>> from fractions import Fraction >>> Fraction; id(Fraction)4775456
クラスもオブジェクトなので、他のオブジェクトと同様に、固有の識別情報 4775456 を持ちます。そこで、クラス Fraction に属する、2つの異なる分数(インスタンス)を生成して、どこに違いがあるかを確認します。
>>> f1 = Fraction(3,4) >>> f2 = Fraction(3,5)
ここで、各分数 f1,f2 に共通する属性 numerator,denominator に着目します。分母 denominator は同じ値ですが、分子 numerator は異なります。では、その値を表わすオブジェクトは、同一でしょうか。
>>> id(f1.numerator); id(f1.denominator) 3483808 3483824 >>> id(f2.numerator); id(f2.denominator) 3483808 3483840
分数 f1,f2 において、分母を表わすインスタンス属性 .denominator を参照すると、異なるオブジェクトが得られます。ところが、分子を表わすインスタンス属性 .numerator を参照すると、同じオブジェクトが得られます。つまり、同じ値というだけではなく、実際に同じオブジェクトを共有します。そこで、各インスタンスの識別性を確認すると、
>>> id(f1); id(f2) 19191408 19298288
f1,f2 は、異なる分数を表わすインスタンスであり、組み込み関数 id() で得られる値から、実際に異なるオブジェクトなのが分かります。
《note》識別性:時間が異なるなら、異なるオブジェクトが同じ識別情報を持ち得ます。
>>> id(p1); id(p2) 19193296 19191408 >>> id(f1); id(f2) 19191408 19298288ここでは、異なるオブジェクトである座標 p2 と分数 f1 とが、同じ識別情報 19191408 を持ちます。□
■ 事例3:Fraction (状態変化)
分数の値(分子/分母)が変わると、そのオブジェクトの状態が変化したものと見なされます。ところが、
>>> f1.numerator = 7 Traceback (most recent call last): File "", line 1, in f1.numerator = 7 AttributeError: can't set attribute
インスタンス属性 .numerator を再設定しようとすると、例外 AttributeError を生成して、エラーメッセージが表示されます。これは、インスタンス属性を再設定できないことを意味します。そこで、分数の演算(加算)を試します。すると、
>>> f3 = f1+1 >>> f3 Fraction(7, 4) >>> f3.numerator 7 >>> id(f3.numerator) 3483872
分子の値が 3 から 7 へと変化して、インスタンス属性 .numerator を再設定できたかのように思えます。
ところが、実際には、
>>> id(f1); id(f3) 19191408 19298608
2つの分数を表わす f1, f3 は、異なるオブジェクトとして存在する分かります。つまり、インスタンス f1 の状態が変化したのではなく、新たなインスタンス f3 を生成したのです。ここで、インスタンス属性の状態を確認すると、
>>> id(f3.numerator); id(f3.denominator) 3483872 3483824
分母を表わすインスタンス属性 .denominator は、同じオブジェクト 4 を共有しているのが分かります。実際に、組み込み演算子 is を用いると、
>>> f1.denominator is f3.denominator True
異なるインスタンス属性が、同じオブジェクトを共有しているのが分かります。
》こちらに移動中です《
↑TOP