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

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

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

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

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

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

継承の概念を実現するのに、いくつかの方法があります。そのひとつが、クラスを使って実現するというものです。そこで、次に(2a)親子関係にあるクラスをどのように表現するかを紹介します。

■ クラスを継承する

新しいクラスを定義するときに、親クラスのメソッドを再定義することには、どのような意味があるのでしょうか。

#                                     Jython
class Replace(MyObject):
  def hello(self):
    print "happy birthday"

クラス Replace は、既存のクラス MyObject を親クラスに持ち、メソッド hello を再定義しています。

#                                     Jython
m3 = Replace()
m3.hello()
# -------------------------------- Output --
happy birthday

式 m3.hello() を評価すると、変数 m3 が束縛するオブジェクトのクラス Replace で再定義された、メソッド関数 hello を呼び出します。すると、文字列 happy birthday が出力されます。

※ 式 m3.hello() を評価すると、文字列 happy birthday が出力されます。これは、m3 の親クラス辞書を検索する前に、m3 のクラス辞書で見つかった、キー属性 hello を参照しているからです。よって、m2 と m3 は、同じ親クラスの子孫でも、同じメソッド呼び出しに対して異なる動作をします。□

#                                     Jython
print m3
# -------------------------------- Output --
<__main__.Replace instance at 0x5234e68>

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

#                                     Jython
print m3.__class__.__bases__
# -------------------------------- Output --
(,)

変数 m3 が束縛するオブジェクトのクラス Replace は、m2 と同様に、MyObject を親クラスに持つので、これを要素とするタプルが得られます。図を見ると、Replace のクラス属性 __bases__ は、MyObject を指しているのが分ります。

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

変数 m3 が束縛するオブジェクトからたどって、そのクラス辞書 __class__.__dict__ を探しても、hello が見つかりません。図を見ると、Replace のクラス辞書 __dict__ には、キー属性 hello が存在しないのが分ります。
式 m3.hello を評価すると、変数 m3 が束縛するオブジェクトのクラス Replace の辞書には、メソッド関数 hello が見つかります。そして、式 m3.hello() は、そのメソッド呼び出しとして解釈されます。すると、文字列 happy birthday が出力されます。

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

《Note》組み込み関数:dir
  dir([object])

引数がないと、その局所的な記号表の中にある、名前リストが得られます。引数があると、object の有効な属性リストが得られます。この情報は、object(クラスまたは型オブジェクト)の属性 __dict__ から集めたものです。得られるリストは、完全なものではありません。object がモジュールオブジェクトなら、その属性の名前が含まれます。object が型またはクラスオブジェクトなら、その属性の名前が含まれます。 さらに、その親クラスの属性が再帰的に含まれます。その他なら、object の属性の名前、そのクラスの属性の名前、そのクラスの親クラスの属性の名前が再帰的に含まれます。リストの項目は、アルファベット順に整列してあります。□

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

object の同一性を表す識別情報が得られます。整数(または long 整数)で表され、object が存在する間は、重複しない不変な値となります。□

《Note》組み込み関数:hex
  hex(x)

与えられた整数 x を、16進数表記に変換した文字列を得ます。□

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


関連記事

Last updated♪2009/08/02