Java.use(better, Jython)《4》継承に警鐘を鳴らす(その肆)

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

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

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

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

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

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

■ 既存のクラスと親子関係を結ぶ

新しいクラスを定義するときに、既存のクラスと親子関係を結ぶことには、どのような意味があるのでしょうか。

#                                     Jython
class Inherit(MyObject):
  pass

クラス Inherit は、既存のクラス MyObject を親クラスに持ち、何もメソッドを定義していません。

※ pass は、空文に相当し、ここでは何もしないことを表します。□

#                                     Jython
m2 = Inherit()
m2.hello()
# -------------------------------- Output --
hello, world


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

#                                     Jython
print m2
# -------------------------------- Output --
<__main__.Inherit instance at 0x52344e0>

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

#                                     Jython
print m1.__class__.__bases__
# -------------------------------- Output --
()

クラス属性 __bases__ を参照すると、その親クラスを要素とするタプルが得られます。変数 m1 が束縛するオブジェクトのクラス MyObject は、親クラスを持たないので、空タプルが得られます。図を見ると、MyObject のクラス属性 __bases__ は、何も指していないのが分かります。

《Note》クラス属性:__bases__
  __bases__

基本クラス(親クラス)を要素とするタプルを束縛します。親クラスを持たないと、空タプルが得られます。□

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

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

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

変数 m2 が束縛するオブジェクトからたどって、そのクラス辞書 __class__.__dict__ を探しても、hello が見つかりません。図を見ると、Inherit のクラス辞書 __dict__ には、キー属性 hello が存在しないのが分かります。

変数 m2 は、Inherit のインスタンスオブジェクトを束縛します。インスタンス属性 __class__ を参照すると、Inherit のクラスオブジェクトが得られます。これは、クラスと同名の変数 Inherit が束縛するオブジェクトと同一です。
MyObject のクラス属性 __dict__ は、メソッド辞書オブジェクトを束縛します。辞書には、メソッド関数と同名のキー属性を保持します。たとえば、hello を参照すると、メソッド関数オブジェクトが得られます。
式 m2.hello を評価すると、変数 m2 が束縛するオブジェクトのクラス Inherit の辞書には、メソッド関数 hello が見つかりません。そこで次に、その親クラス MyObject を探します。そして、その辞書には、メソッド関数 hello が見つかります。すると、m1.hello() と同様に、文字列 hello, world が出力されます。

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

Inherit のクラス辞書には、メソッド関数 hello が存在しません。そのため、その親クラス MyObject を探す必要があります。

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

MyObject のクラス辞書には、メソッド関数 hello が存在します。しかし、有効なメソッドを確認するのに、クラス階層を辿るのは面倒です。

#                                     Jython
print dir(Inherit)
# -------------------------------- Output --
['__doc__', '__module__', 'hello']

組み込み関数 dir を使うと、有効な属性のリストが得られます。どこに属性が存在するかではなく、どの属性が有効かを知るのに便利です。すると、Inherit のインスタンスには、メソッド呼び出し hello() が有効であることが分ります。

#                                     Jython
print dir(m2)
# -------------------------------- Output --
['__doc__', '__module__', 'hello']

クラス Inherit だけではなく、そのインスタンス m2 からも、同じリストが得られます。

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


関連記事

Last updated♪2009/08/02