1

classPython のステートメントはスコープを作成すると思いました。しかし、この単純なコードを試してみると、エラーが発生します:

class A():
    foo = 1 
    def __init__(self):
        print foo 

a = A() 

NameError: global name 'foo' is not defined

fooイニシャライザからアクセスできないのはなぜですか? それにアクセスする適切な方法は何ですか?

4

1 に答える 1

10

クラスはスコープを作成しません。これはpep 227に記載されています:

クラス スコープ内の名前にはアクセスできません。名前は、最も内側の関数スコープで解決されます。クラス定義がネストされたスコープのチェーンで発生する場合、解決プロセスはクラス定義をスキップします。

およびclass複合ステートメントのドキュメントで:

クラスのスイートは、新しく作成されたローカル名前空間と元のグローバル名前空間を使用して、新しい実行フレームで実行されます (名前付けとバインディングを参照)。(通常、スイートには関数定義のみが含まれます。) クラスのスイートの実行が終了すると、その実行フレームは破棄されますが、そのローカル名前空間は保存されます。[4]次に、基本クラスの継承リストと属性ディクショナリの保存されたローカル名前空間を使用して、クラス オブジェクトが作成されます。

鉱山を強調します。実行フレームは一時的なスコープです。

にアクセスするには、次fooを使用しますself.foo

class A():
    foo = 1 
    def __init__(self):
        print self.foo 

またはA名前でクラスにアクセスするか、現在のクラス (サブクラスである可能性があります)type(self)にアクセスするために使用します。

def __init__(self):
    print A.foo 

また

def __init__(self):
    print type(self).foo 
于 2013-06-07T09:35:18.523 に答える