Memo Life

ビギナーSEのメモ書き

【python勉強】03.名前空間、クラス、オブジェクトについて

Python名前空間の前提

名前空間は「名前」からオブジェクトへの対応づけのことを表す。
ほとんどの場合、Pythonの辞書として実装されている。

f:id:nata_water:20140429192229p:plain


名前空間の寿命

様々な時点で名前空間が作成され、寿命もさまざまである。
 

名前空間

イベント

アクション

組み込みの名前空間

Pythonインタプリタ起動
Pythonインタプリタ終了

名前空間作成
名前空間削除

グローバル名前空間(モジュール)

モジュール定義読み込み

グローバル名前空間作成

関数のローカル名前空間

関数呼び出し時
関数戻り、関数内例外
関数内未処理

名前空間作成
名前空間削除
(Python名前空間を忘れる、
といった表現が適切かもしれない)

インタプリタのトップレベルで実行された文は?
スクリプトファイルから読みだされたものでも、対話的に読みだされたものでも、
__main__という名前のモジュールの一部分であるとみなされるため、
「独自の名前空間」を持つことになる。

スコープ(scope)

ある名前空間が直接アクセスできるようなPythonプログラムのテキスト上の領域。
→直接アクセス可能とは、修飾無しに、hoge.nataでなく、nataのように名前を
 参照した際に、その名前空間から名前を見つけようと試みることを意味する。

スコープは、静的に「決定」されるが、動的に「使用」される。

  • 最初に探索される最も内側のスコープは、ローカルの名前を持っている
  • 外側の(enclosing)関数のスコープは近い方から順に検索され、ローカルでもグローバルでもない名前を持っている
  • 次のスコープは、現在のモジュールのグローバルな名前を持っている
  • 一番外側(最後に探索される)スコープはビルトイン名を持っている。

例:local_valueを見つけるためにはどんな動きをするのか?
f:id:nata_water:20140429192232p:plain

※global文を利用することで、特定の変数がグローバルスコープにあることを示すことが可能

クラス

クラス定義に入ると、新たな名前空間が作成され、ローカルな名前空間として使われる。
したがって、ローカルな変数に対する全ての代入は、この新たな名前空間に入る。
f:id:nata_water:20140429192236p:plain

データ属性でないインスタンス属性(メソッドオブジェクト)が参照された時は、
そのクラスが検索される(図:クラスオブジェクトMyClass)

その名称が、有効なクラス属性を表している「関数オブジェクト」ならば、

インスタンスオブジェクト と ②見つかった「関数オブジェクト」を
抽象オブジェクト(図:メソッドオブジェクトmyfunc)
すなわち、メソッドオブジェクトにパックして作成される。


参照リファレンス:
http://docs.python.jp/2/tutorial/classes.html#python