オブジェクトの情報を探る(1) - イントロスペクション
【 目次 】
内省的なpython
Pythonの魅力は内省的という事。
Pythonではすべてがオブジェクト、そしてPythonのオブジェクトは自分が何者であるかを教えてくれる。
この事をPythonはイントロスペクションとか内省的と呼ぶようだ。
-
hanepjiv: Python / 内省的(introspective)とはどういうことか
「内部を見通すことのできる、使いやすいシンプルな環境」が揃っている。 -
動的なオブジェクト指向プログラミング言語であるPythonは、非常に強力なイントロスペクションをサポートしています。
pythonのクラスは丸裸、メンバアクセスを保護する手段が無い。
これが、pythonの大きな欠点。
でも、発想の転換をしてみれば、なんでもアクセスできてしまう柔軟性こそが最大の長所では。
Javaのような厳格な頑固おやじとは、ま逆。
- hanepjiv: Python / 不便が便利
Pythonにはメンバアクセスを保護する機能はありません。publicとか、privateとかです。 保護したいと思ってもできない『不便』な仕様です。
...
高速にプロトタイプを組み上げるラピッドタイピング段階では、 Pythonのメンバアクセス制限のように保護機能を全く考慮しない言語の方が気楽に扱えます。
イントロスペクション(introspection)ということば
introspectionとは内省。
では、内省とは
内省とは自己をかえりみる事。
ちょっと、本題からはなれるが、
リフレクションとイントロスペクションは似ているらしい。
Javaの例であるが
・リフレクションは、実行時にオブジェクトの情報を参照して、それを元にオブジェクトを操作する方法
・イントロスペクションは、実行時にオブジェクトの情報を参照して、その情報にさらに変更を加える方法
インスペクション(inspection)とかインセプション(inception)という言葉もあってまぎらわしい。
インスペクションとは、設計図やコードを組織的にレビューするための手法のことだ。インセプションとは、オブジェクト指向の開発プロセスRUPで行なわれる一番最初のフェーズ、いわゆる「方向づけ」フェーズのことだ。
そう言えば、デバッガーで変数の内容を確認(検査)する時にインスペクトするとかいう言葉を使ったような。
pythonのキーワード一覧を調べる
import keyword print keyword.kwlist
オブジェクトの型を調べる
組み込み関数type,isinstance,issubclass。
ローカルなシンボル,グローバルなシンボルを調べる。
locals関数を使うとのその関数内やクラス,メソッド内でのローカルなシンボルの辞書を取得できる。
globals関数を使うとモジュール内のグローバルな名前の辞書を取得できる。
sysモジュールとosモジュール
sysモジュールやosモジュールで定義されている変数の値を参照する事で、環境に対する情報をいろいろ教えてくれる。
- Pythonの実行環境の情報を取得する - 山本隆の開発日誌
- 27.1. sys — システムパラメータと関数 — Python 2.7ja1 documentation
- 15.1. os — 雑多なオペレーティングシステムインタフェース — Python 2.7ja1 documentation
dis モジュール
Pythonのバイトコードを調べる。
inspectモジュール
inspectモジュールには、オブジェクトの情報を取得するための便利な関数が用意されている。
- 28.13. inspect — 活動中のオブジェクトの情報を取得する — Python 2.7.x ドキュメント
- inspect – Inspect live objects - Python Module of the Week
inspectモジュールの関数については、次回以降に述べる事にする。