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

記事一覧《こちらに移動中です》2006年6月12日 (月)

Java.use(better, Python)  # Stairway to Real Agile World

《6》継承に警鐘を鳴らす(その陸)《Jython2.5.0》

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

■ 概要

継承の概念を実現するのに、いくつかの方法があります。そのひとつが、新しいクラスに対して、すべてのインスタンスに共通のメソッドを定義した後で、そのインスタンスに固有のメソッドを再定義するというものです。これによって(2c)クラスとインスタンス間の継承を実現できます。

継承には、
 (1)構造継承
 (2)機能継承
 (3)プロトコル継承
があって、さらに(2)機能継承は、次の3つに分類されます。
 (2a)親子関係にあるクラス間の継承
 (2b)親子関係にないクラス間の継承
 (2c)クラスとインスタンス間の継承
ともすると、Java/C# などでは、狭義の(2a)に関心が寄せられがちです。しかし、純粋な OOP の世界では、その限りではありません。では、広義の継承は、どのように実現するのでしょうか。

■ 関連記事
  •  


前の記事次の記事

《6》継承に警鐘を鳴らす(その陸)

新しいクラスを定義した後で、そのインスタンスに固有のメソッドを再定義することには、どのような意味があるのでしょうか。

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

def happy():
  print "happy birthday"

クラス MyObject では、メソッド hello を定義しています。また、このモジュールでは、関数 happy を定義しています。def 文は、関数オブジェクトを生成して、これを関数名 happy に代入します。

《Note》文:def
  def

関数定義は、利用者定義の関数オブジェクトを定義します。関数定義は、実行文です。これを実行すると、その局所的な名前空間において、関数名に関数オブジェクト(実行可能なコードのラッパー)が束縛されます。関数オブジェクトには、その大域的な名前空間の参照が含まれます。□

#                                     Jython
m4 = MyObject()
m4.hello = happy
m4.hello()
# -------------------------------- Output --
happy birthday

式 m4.hello() を評価すると、変数 m4 が束縛するオブジェクトで再定義された、メソッド関数 hello を呼び出します。すると、文字列 happy birthday が出力されます。関数もオブジェクトなので、インスタンス辞書に登録できます。代入文 m4.hello = happy を実行すると、m4 のインスタンス属性 hello に、関数オブジェクト happy が代入されます。

#                                     Jython
print  m1.hello
# -------------------------------- Output --
>

文 print m1.hello を実行すると、変数 m1 が束縛するオブジェクトの属性 hello に関する情報が出力されます。これから、hello は、MyObject のクラス辞書に登録された`メソッド関数`であることが分ります。

#                                     Jython
print  m4.hello
# -------------------------------- Output --

文 print m4.hello を実行すると、変数 m4 が束縛するオブジェクトの属性 hello に関する情報が出力されます。これから、hello は、そのモジュール内で定義された`関数オブジェクト`であることが分ります。

#                                     Jython
print  hello
# -------------------------------- Output --

文 print hello を実行すると、同じ情報が出力されます。よって、m4 のインスタンス辞書に登録されたキー属性 hello を参照すると、関数オブジェクト happy と同じものが得られることが分ります。


式 m4.hello を評価すると、m4 のインスタンス辞書の中から、キー項目 hello に対する値として、関数オブジェクト happy が得られます。そして、式 m4.hello() は、その関数呼び出しとして解釈されます。すると、文字列 happy birthday が出力されます。

#                                     Jython
print  m1.__dict__
# -------------------------------- Output --
{}

変数 m1 が束縛するオブジェクトのインスタンス辞書には、属性が存在しません。

#                                     Jython
print  m4.__dict__
# -------------------------------- Output --
{'hello': }

変数 m4 が束縛するオブジェクトのインスタンス辞書には、キー項目 hello に対する値として、関数オブジェクト happy が登録されています。
==================================
後藤いるか+伊藤うさぎ 著 ◆ 監修:小泉ひよ子とタマゴ倶楽部

更新♪2009/08/02