Java.use(better, Python)《5》継承に警鐘を鳴らす(その伍)
‖記事一覧‖ Java.use(better, Jython)《Jython2.5》
《こちらに移動中です》2006年6月 9日 (金)
継承に警鐘を鳴らす(その伍)
継承に警鐘を鳴らす(その壱)
継承の概念を実現するのに、いくつかの方法があります。そのひとつが、クラスを使って実現するというものです。そこで、次に(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