Java.use(better, Jython)《4》継承に警鐘を鳴らす(その肆)
‖記事一覧‖ Java.use(better, Jython)《Jython2.5》
《こちらに移動中です》2006年6月 8日 (木)
継承に警鐘を鳴らす(その肆)
継承に警鐘を鳴らす(その肆)
継承の概念を実現するのに、いくつかの方法があります。そのひとつが、クラスを使って実現するというものです。そこで、次に、親子関係にあるクラスをどのように表現するかを紹介します。
■ 既存のクラスと親子関係を結ぶ
新しいクラスを定義するときに、既存のクラスと親子関係を結ぶことには、どのような意味があるのでしょうか。
# 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