Python.use(better) #OOP:識別性 -- クラスオブジェクト

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

識別性 -- クラスオブジェクト

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

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

オブジェクトの3要素

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

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

が挙げられます。

概要

関数やクラスを定義するということは、その名前と同じ変数によって、生成した関数オブジェクトやクラスオブジェクトを束縛しているにすぎません。

《承前》

クラスを定義するということ

クラスを定義することの意義について考察します。

    
Traceback (most recent call last): File "", line 1, in TIPS NameError: name 'TIPS' is not defined
未定義のクラスを参照しようとすると、例外 NameError を生成して、エラーメッセージが出力されます。これは「クラスの名前(識別子)が未定義である」ことを意味します。この状況は、未定義の変数と同じです。
《tips》変数は、それによって束縛されるオブジェクトとは独立した概念です。そのため、対象となるオブジェクト(整数、関数、クラスなど)には依存しない、共通の操作が可能になります。
クラスオブジェクト
クラスオブジェクトは、リテラル表現を持たないので、それを参照する術がありません。変数は、任意の「クラス」オブジェクトを参照する手段を提供します。
>>> class Tips:    #5:
    def __init__(self): pass

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

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

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

>>> type(Tips)
<class 'type'>
>>> type(Tips.__init__)
<class 'function'>
同じコード(クラスの本体)を持つ、クラス Tips を再定義します。このとき、どのようなオブジェクトが生成されては、解放されるのでしょうか。
■ #5:
(クラスの名前と同じ)変数 Tips は、クラスオブジェクト(id:4770336)を参照する手段を提供します。さらに(メソッドの名前と同じ)属性変数 __init__ は、関数オブジェクト(id:19228184)を参照する手段を提供します。
■ #6:
変数 Tips の束縛を解いて、あるクラスオブジェクト(id:4770336)を解放します。すると、変数 Tips を介して、別のクラスオブジェクト(id:4784288)を参照できるようになります。さらに(メソッドの名前と同じ)属性変数 __init__ は、関数オブジェクト(id:19228328)を参照する手段を提供します。 2つのクラスオブジェクトは、どちらも同じコード(クラスの本体)を持ちますが、それぞれに異なるオブジェクトです。そのため、変数 Tips を介して得られる機能は同じですが、それを実現するのは異なるクラスオブジェクトです。
《note》変数による束縛:クラスと同じ名前の変数を介して「クラス」オブジェクトを参照する様子は、変数によって「整数」オブジェクトを参照する場合と同じです。クラスオブジェクトはリテラル表現を持たないので、生成したクラスオブジェクトを参照するには、変数を利用するしか術がありません。変数によって束縛されていないクラスオブジェクトは、やがて回収される運命にあります。
》こちらに移動中です《TOP

関連記事

Last updated♪2009/12/19