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〕

が挙げられます。

■ 事例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


関連記事

Last updated♪2009/12/28