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》同時刻でなければ、異なるオブジェクトが同じ値を持ち得るので、注意が必要です。□

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

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

>>> a = 345
>>> id(a)
19121504
>>> a = 345
>>> id(a)
19121648
>>> type(a)

>>> 
>>> def piyo(): pass

>>> id(piyo)
19044008
>>> 
>>> def piyo(): pass

>>> id(piyo)
19227896
>>> type(piyo)


>>> class Tips:
	def __init__(self): pass

>>> id(Tips)
4770336
>>> id(Tips.__init__)
19228184

>>> class Tips:
	def __init__(self): pass

>>> id(Tips)
4784288
>>> id(Tips.__init__)
19228328

>>> type(Tips)

>>> type(Tips.__init__)

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


関連記事

Last updated♪2009/12/17