class
Python のステートメントはスコープを作成すると思いました。しかし、この単純なコードを試してみると、エラーが発生します:
class A():
foo = 1
def __init__(self):
print foo
a = A()
NameError: global name 'foo' is not defined
foo
イニシャライザからアクセスできないのはなぜですか? それにアクセスする適切な方法は何ですか?
class
Python のステートメントはスコープを作成すると思いました。しかし、この単純なコードを試してみると、エラーが発生します:
class A():
foo = 1
def __init__(self):
print foo
a = A()
NameError: global name 'foo' is not defined
foo
イニシャライザからアクセスできないのはなぜですか? それにアクセスする適切な方法は何ですか?
クラスはスコープを作成しません。これはpep 227に記載されています:
クラス スコープ内の名前にはアクセスできません。名前は、最も内側の関数スコープで解決されます。クラス定義がネストされたスコープのチェーンで発生する場合、解決プロセスはクラス定義をスキップします。
クラスのスイートは、新しく作成されたローカル名前空間と元のグローバル名前空間を使用して、新しい実行フレームで実行されます (名前付けとバインディングを参照)。(通常、スイートには関数定義のみが含まれます。) クラスのスイートの実行が終了すると、その実行フレームは破棄されますが、そのローカル名前空間は保存されます。[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