今日も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 コメント:
コメントを投稿