この機能に関する古代の回答で私が行った内容は次のとおりです。
発生した問題は、次の理由によるものです。
ブロックは、ユニットとして実行されるPythonプログラムテキストの一部です。ブロックは次のとおりです。モジュール、関数本体、およびクラス定義。
(...)
スコープは、ブロック内の名前の可視性を定義します。
(...)
クラスブロックで定義されている名前の範囲は、クラスブロックに限定されています。メソッドのコードブロックには拡張されません。関数スコープを使用して実装されるため、ジェネレーター式が含まれます。これは、以下が失敗することを意味します。
クラスA:
a = 42
b = list(a + i for i in range(10))
http://docs.python.org/reference/executionmodel.html#naming-and-binding
上記の意味:関数本体はコードブロックであり、メソッドは関数であり、クラス定義に存在する関数本体から定義された名前は関数本体に拡張されません。
私がこれを読んでいたとき、それは私には奇妙に見えました、しかしそれはPythonが作られている方法です:
クラスブロックで定義されている名前の範囲は、クラスブロックに限定されています。メソッドのコードブロックには拡張されません
これは、これを示す公式ドキュメントです。
。
編集
heltonbikerは興味深いコードを書きました:
COLOR = 'blue'
class TellColor(object):
COLOR = 'red'
def tell(self):
print self.COLOR # references class variable
print COLOR # references module variable
a = TellColor()
a.tell()
> red
> blue
print COLOR
メソッド内に記述された命令がtell()
、クラス外で定義されたグローバルオブジェクトCOLORの値の出力をどのように引き起こすのか不思議に思いました。
私は公式文書のこの部分で答えを見つけました:
メソッドは、通常の関数と同じ方法でグローバル名を参照できます。メソッドに関連付けられたグローバルスコープは、その定義を含むモジュールです。(クラスがグローバルスコープとして使用されることはありません。)メソッドでグローバルデータを使用する正当な理由に遭遇することはめったにありませんが、グローバルスコープの正当な使用法はたくさんあります。たとえば、グローバルスコープにインポートされた関数とモジュールは次のことができます。メソッド、およびメソッドで定義された関数とクラスによって使用されます。通常、メソッドを含むクラス自体は、このグローバルスコープで定義されます(...)
http://docs.python.org/2/tutorial/classes.html#method-objects
COLORはインスタンス属性ではないため(つまり、識別子'COLOR'はインスタンスの名前空間に属していないため)、インタプリタが実行する必要がある場合、インタプリタはインスタンスのクラスの名前空間に移動しprint self.COLOR
ます。識別子「COLOR」を検索して見つけると、TellColor.COLORの値が出力されます。
インタプリタが実行する必要がある場合print COLOR
、この命令には属性アクセスが記述されていないため、グローバル名前空間で識別子「COLOR」を検索します。これは公式ドキュメントにモジュールの名前空間であると記載されています。