Java.use(better, Python)《3》継承に警鐘を鳴らす(その参)
‖記事一覧‖ Java.use(better, Python)《Jython2.5》
《こちらに移動中です》2006年6月 7日 (水)
継承に警鐘を鳴らす(その参)
継承に警鐘を鳴らす(その参)
■ クラスを定義する
単純なクラスを定義します。
# Jython class MyObject: def hello(self): print "hello, world"
クラス MyObject では、メソッド関数 hello を定義しています。
# Jython m1 = MyObject() m1.hello() # -------------------------------- Output -- hello, world
変数 m1 には、作成した MyObject のインスタンスを代入します。式 m1.hello() を評価すると、m1 のクラス MyObject で定義されたメソッド関数 hello を呼び出します。すると、文字列 hello, world が出力されます。
変数 m1 は、MyObject のインスタンスオブジェクトを束縛します。インスタンス属性 __class__ を参照すると、MyObject のクラスオブジェクトが得られます。これは、クラスと同名の変数 MyObject が束縛するオブジェクトと同一です。
MyObject のクラス属性 __dict__ は、メソッド辞書オブジェクトを束縛します。辞書には、メソッド関数と同名のキー属性を保持します。たとえば、hello を参照すると、メソッド関数オブジェクトが得られます。
# Jython print m1 # -------------------------------- Output -- <__main__.MyObject instance at 0x523a5d0>
文 print m1 を実行すると、変数 m1 が束縛するオブジェクトに関する情報が出力されます。すると、m1 は、MyObject のインスタンスであり、固有の識別番号を持つことが分ります。
※ 識別番号は、実行環境ごとに値が異なります。□
《Note》文:print
式を順に評価して、その結果として得られるオブジェクトを標準出力に書き出します。オブジェクトが文字列でないと、まず文字列変換の規則を適用して、文字列に変換します。□
# Jython type(m1) # -------------------------------- Output --
組み込み関数 type を使うと、その型が得られます。すると、変数 m1 が束縛するオブジェクトは、インスタンス instance であることが分ります。
《Note》組み込み関数:type
type(object)object の型(type オブジェクト)を得ます。オブジェクトの型を調べるには、組み込み関数 isinstance() を使うようにします。□
# Jython hex(id(m1)) # -------------------------------- Output -- '0x5234918'
組み込み関数 id を使うと、その識別番号が得られます。組み込み関数 hex を使うと、その16進数表記が得られます。すると、変数 m1 が束縛するオブジェクトは、同じ識別番号を持つことが分ります。
# Jython print MyObject.__dict__ # -------------------------------- Output -- {'__module__': '__main__', 'hello':, '__doc__': None}
クラス MyObject の属性 __dict__ を参照すると、クラス辞書の内容が得られます。すると、この辞書の中に、メソッド関数 hello が存在するのが分かります。図を見ると、MyObject のクラス辞書 __dict__ には、キー属性 hello が存在します。
# Jython print m1.__class__.__dict__ # -------------------------------- Output -- {'__module__': '__main__', 'hello':, '__doc__': None}
変数 m1 が束縛するオブジェクトの属性 __class__ を参照すると、そのクラス MyObject が得られます。こうして、m1 からも、クラス辞書 __dict__ の中に hello をたどれます。よって、式 m1.hello を評価すると、m1 のクラス辞書から、メソッド関数 hello が得られます。すると、式 m1.hello() は、そのメソッド呼び出しと解釈されます。そして、文字列 hello, world が出力されます。
※ クラスおよびインスタンスに共通する属性を、オブジェクト属性と表現しています。□
》こちらに移動中です《
↑TOP