【python勉強】03.名前空間、クラス、オブジェクトについて
Python名前空間の前提
名前空間は「名前」からオブジェクトへの対応づけのことを表す。ほとんどの場合、Pythonの辞書として実装されている。
名前空間の寿命
様々な時点で名前空間が作成され、寿命もさまざまである。名前空間 |
イベント |
アクション |
---|---|---|
組み込みの名前空間 |
Pythonインタプリタ起動 Pythonインタプリタ終了 |
名前空間作成 名前空間削除 |
グローバル名前空間(モジュール) |
モジュール定義読み込み |
グローバル名前空間作成 |
関数のローカル名前空間 |
関数呼び出し時 関数戻り、関数内例外 関数内未処理 |
名前空間作成 名前空間削除 (Pythonが名前空間を忘れる、 といった表現が適切かもしれない) |
インタプリタのトップレベルで実行された文は?
スクリプトファイルから読みだされたものでも、対話的に読みだされたものでも、
__main__という名前のモジュールの一部分であるとみなされるため、
「独自の名前空間」を持つことになる。
スコープ(scope)
ある名前空間が直接アクセスできるようなPythonプログラムのテキスト上の領域。→直接アクセス可能とは、修飾無しに、hoge.nataでなく、nataのように名前を
参照した際に、その名前空間から名前を見つけようと試みることを意味する。
スコープは、静的に「決定」されるが、動的に「使用」される。
- 最初に探索される最も内側のスコープは、ローカルの名前を持っている
- 外側の(enclosing)関数のスコープは近い方から順に検索され、ローカルでもグローバルでもない名前を持っている
- 次のスコープは、現在のモジュールのグローバルな名前を持っている
- 一番外側(最後に探索される)スコープはビルトイン名を持っている。
例:local_valueを見つけるためにはどんな動きをするのか?
※global文を利用することで、特定の変数がグローバルスコープにあることを示すことが可能
クラス
クラス定義に入ると、新たな名前空間が作成され、ローカルな名前空間として使われる。したがって、ローカルな変数に対する全ての代入は、この新たな名前空間に入る。
データ属性でないインスタンス属性(メソッドオブジェクト)が参照された時は、
そのクラスが検索される(図:クラスオブジェクトMyClass)
その名称が、有効なクラス属性を表している「関数オブジェクト」ならば、
①インスタンスオブジェクト と ②見つかった「関数オブジェクト」を
抽象オブジェクト(図:メソッドオブジェクトmyfunc)
すなわち、メソッドオブジェクトにパックして作成される。
参照リファレンス:
http://docs.python.jp/2/tutorial/classes.html#python