Python.use(better) #OOP:識別性〔identity〕

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

OOP:識別性〔identity〕

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

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

オブジェクトの3要素

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

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

が挙げられます。

■ 識別性

識別性は、あるオブジェクトを他のオブジェクト群と区別するのに必要な特性です。

DNA 情報を用いて、個人を識別する技術が確立されています。ただし、双子の DNA は同じなので、これでは不十分です。それでも、指紋だけは異なるので、これなら識別できます。また、GPS〔Global Positioning System〕を用いて、その位置を特定する技術が確立されています。その時刻にその場所に立てるのはたった1人なので、これも個人を識別するのに有効です。

では、オブジェクトを区別するには、何を利用するのが便利でしょうか。GPS と同様に、その位置だけで各オブジェクトを特定したいなら「アドレス」を利用できます。なぜなら、その時刻にそのアドレスに存在するオブジェクトは、ただ1つだからです。すると、組み込み関数 id によって、各オブジェクトを識別する情報としてアドレス値が得られるのも、納得がいくでしょう。

《note》同時刻でなければ、異なるオブジェクトが同じ id 値を持ち得るので、注意が必要です。□

コードを記述するときには、変数を用いてオブジェクトを特定できます。ただし、変数の識別子(名前)とオブジェクト自身の識別性とを、混同しないように注意が必要です。異なるオブジェクトを参照するには、異なる変数を利用します。ただし、変数が異なるからと言って、参照するオブジェクトが異なるとは限りません。このような状況を、次の事例で示します。

■ 事例1:異なる変数が同じオブジェクトを参照する
>>> a = 3; b = 3
>>> id(a); id(b)
3483808
3483808

>>> c, d = 3, 3
>>> id(c); id(d)
3483808
3483808

>>> a is b
True
>>> c is d
True


このとき、異なる4つの変数によって参照される 3 は、すべて同一のオブジェクトです。

■ 事例2:異なる変数が異なるオブジェクトを参照する
>>> a = 345; b = 345
>>> id(a); id(b)
19121648
19121648

>>> c, d = 345, 345
>>> id(c); id(d)
19121056
19121712

>>> a is b
True
>>> c is d
False


このとき、異なる4つの変数によって参照される 345 は、同一のオブジェクトとは限りません。

■ 発展課題

同じ値を持つ整数リテラルに対して、次のように、

>>> x, y = 256, 256
>>> x is y
True
>>> x, y = 257, 257
>>> x is y
False

複数の異なるオブジェクトが生成されることがあります。この状況は、Python のバージョンの違い、また Jython/IronPython でも異なります。そこで、この境界値(ここでは 256,257)を検出するプログラムを作成してください。


《hint》Jython2.5 では、次のように、

>>> x = 899
>>> y = 899
>>> x is y
True
>>> x = 900
>>> y = 900
>>> x is y
False

その境界値(ここでは 2 899,900)が、Python3.1 とは異なります。

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


関連記事

Last updated♪2009/12/20