メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2008年2月23日土曜日

[Python][お勉強] Python入門(51) - クラス、インスタンスにおける名前空間の注意事項

今日もPythonお勉強。

クラス、インスタンスにおける注意事項から。

特に気をつけるのは、「.」を使って指定された場合とそうでない場合。
「.」を使って指定された名前を修飾名といい、「.」を使わないで指定された名前を
非修飾名という。

修飾名と非修飾名ではスコープ決定ルールが違う。
非修飾名の場合にはLEGBルールが適用される。
修飾名の場合には特定のオブジェクトの名前空間に属する。

非修飾名のルール


X = 100
 

といったコードの場合、Xは非修飾名。
この場合、その変数がどのスコープに属するかをまずローカルスコープから順に
ネストスコープ、グローバルスコープ、ビルトインスコープで検索される。
いわゆるLEGBルール。

修飾名のルール

hogehoge.taratara = 'hogetarapii'
 

といったコードの場合にはtarataraは修飾名。
この際は属性の検索はhogehogeより上位のクラスで検索が行われることはない。


hogehoge.taratara
 

といったコードの場合、hogehogeオブジェクトのオブジェクトツリーが検索される。
最初にhogehogeオブジェクトが検索され、次にその上位のクラスが検索される。
また、hogehogeがクラスやインスタンスでなく、モジュールであった場合は当然であるが、
オブジェクトツリーで検索は行われない。


値が代入される場所
修飾名、非修飾名にはそれぞれいくつかの種類がある。
そのためどこに属する属性なのかがわかりにくくなる場合がある。
が、Pythonでは「どこで代入するか」が重要な意味があるとのこと。

その面白い例

>>> X = 11
>>>
>>> class C1:
... X = 22 # クラスの属性
... def m(self):
... X = 33 # メソッドのローカル変数
... self.X = 44 # インスタンス属性
...
>>> def f():
... X = 55 # 関数のローカル変数
...
>>> def g():
... print X # モジュールのグローバル変数
...
>>>
 

6箇所で使われているXという名の変数は、最初の1つを除いて全て別の変数。



変数の扱いについては要注意。



おしまい。
.

0 コメント: