Java.use(better, Python)《3》継承に警鐘を鳴らす(その参)

記事一覧 Java.use(better, Python)《Jython2.5》

《こちらに移動中です》2006年6月 7日 (水)

継承に警鐘を鳴らす(その参)

《著》後藤いるか・伊藤うさぎ・小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23

継承に警鐘を鳴らす(その参)

■ クラスを定義する

単純なクラスを定義します。

#                                     Jython
class MyObject:
  def hello(self):
    print "hello, world"

クラス MyObject では、メソッド関数 hello を定義しています。

#                                     Jython
m1 = MyObject()
m1.hello()
# -------------------------------- Output --
hello, world

変数 m1 には、作成した MyObject のインスタンスを代入します。式 m1.hello() を評価すると、m1 のクラス MyObject で定義されたメソッド関数 hello を呼び出します。すると、文字列 hello, world が出力されます。

《Note》コンストラクター:呼び出し

コンストラクターを呼び出すときには、特別な構文規則を必要としません。クラスと同名の関数呼び出しを記述するだけです。□

変数 m1 は、MyObject のインスタンスオブジェクトを束縛します。インスタンス属性 __class__ を参照すると、MyObject のクラスオブジェクトが得られます。これは、クラスと同名の変数 MyObject が束縛するオブジェクトと同一です。
MyObject のクラス属性 __dict__ は、メソッド辞書オブジェクトを束縛します。辞書には、メソッド関数と同名のキー属性を保持します。たとえば、hello を参照すると、メソッド関数オブジェクトが得られます。

#                                     Jython
print m1
# -------------------------------- Output --
<__main__.MyObject instance at 0x523a5d0>

文 print m1 を実行すると、変数 m1 が束縛するオブジェクトに関する情報が出力されます。すると、m1 は、MyObject のインスタンスであり、固有の識別番号を持つことが分ります。
※ 識別番号は、実行環境ごとに値が異なります。□

《Note》文:print
  print

式を順に評価して、その結果として得られるオブジェクトを標準出力に書き出します。オブジェクトが文字列でないと、まず文字列変換の規則を適用して、文字列に変換します。□

#                                     Jython
type(m1)
# -------------------------------- Output --

組み込み関数 type を使うと、その型が得られます。すると、変数 m1 が束縛するオブジェクトは、インスタンス instance であることが分ります。

《Note》組み込み関数:type
  type(object)

object の型(type オブジェクト)を得ます。オブジェクトの型を調べるには、組み込み関数 isinstance() を使うようにします。□

#                                     Jython
hex(id(m1))
# -------------------------------- Output --
'0x5234918'

組み込み関数 id を使うと、その識別番号が得られます。組み込み関数 hex を使うと、その16進数表記が得られます。すると、変数 m1 が束縛するオブジェクトは、同じ識別番号を持つことが分ります。

#                                     Jython
print MyObject.__dict__
# -------------------------------- Output --
{'__module__': '__main__', 'hello': , '__doc__': None}

クラス MyObject の属性 __dict__ を参照すると、クラス辞書の内容が得られます。すると、この辞書の中に、メソッド関数 hello が存在するのが分かります。図を見ると、MyObject のクラス辞書 __dict__ には、キー属性 hello が存在します。

《Note》オブジェクト属性:__dict__
  __dict__

オブジェクトの属性を格納するための(クラスおよびインスタンス)辞書です。□

#                                     Jython
print m1.__class__.__dict__
# -------------------------------- Output --
{'__module__': '__main__', 'hello': , '__doc__': None}

変数 m1 が束縛するオブジェクトの属性 __class__ を参照すると、そのクラス MyObject が得られます。こうして、m1 からも、クラス辞書 __dict__ の中に hello をたどれます。よって、式 m1.hello を評価すると、m1 のクラス辞書から、メソッド関数 hello が得られます。すると、式 m1.hello() は、そのメソッド呼び出しと解釈されます。そして、文字列 hello, world が出力されます。
※ クラスおよびインスタンスに共通する属性を、オブジェクト属性と表現しています。□

《Note》インスタンス属性:__class__
  __class__

インスタンスが属するクラスを表します。□

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