回答:
代わりのbar
使用self.bar
またはFoo.bar
。に割り当てるとFoo.bar
静的変数self.bar
が作成され、to に割り当てるとインスタンス変数が作成されます。
クラスメソッドを定義します。
class Foo(object):
bar = 1
@classmethod
def bah(cls):
print cls.bar
bah()
インスタンスメソッドでなければならない場合(つまり、selfにアクセスできる場合)、クラス変数に直接アクセスできます。
class Foo(object):
bar = 1
def bah(self):
print self.bar
すべての優れた例と同様に、実際に実行しようとしていることを単純化しました。これは良いことですが、クラス変数とインスタンス変数の関係でpythonには多くの柔軟性があることは注目に値します。メソッドについても同じことが言えます。可能性の良いリストについては、MichaelFötschの新しいスタイルのクラスの紹介、特にセクション2〜6を読むことをお勧めします。
開始時に覚えるのに多くの作業が必要なことの1つは、PythonはJavaではないということです。 単なる決まり文句以上のもの。Javaでは、クラス全体がコンパイルされ、名前空間の解決が非常に単純になります。メソッドの外部(どこでも)に宣言された変数はインスタンス(または静的な場合はクラス)変数であり、メソッド内で暗黙的にアクセスできます。
pythonでは、大まかな経験則として、変数を検索するために3つの名前空間が順番に検索されます。
{begin pedagogy}
これには限られた例外があります。私に発生する主なものは、クラス定義がロードされているとき、クラス定義はそれ自体の暗黙的な名前空間であるということです。しかし、これはモジュールがロードされている間だけ続き、メソッド内では完全にバイパスされます。したがって:
>>> class A(object):
foo = 'foo'
bar = foo
>>> A.foo
'foo'
>>> A.bar
'foo'
だが:
>>> class B(object):
foo = 'foo'
def get_foo():
return foo
bar = get_foo()
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
class B(object):
File "<pyshell#11>", line 5, in B
bar = get_foo()
File "<pyshell#11>", line 4, in get_foo
return foo
NameError: global name 'foo' is not defined
{end pedagogy}
最後に、覚えておくべき事は、あなたがいることであるかアクセスしたい変数のいずれかへのアクセス権を持っていますが、おそらくない暗黙のうちに。目標が単純で単純な場合は、おそらくFoo.barまたはself.barで十分です。例がさらに複雑になった場合、または継承などの豪華なことをしたい場合(静的/クラスのメソッドを継承できます!)、またはクラス自体の中でクラスの名前を参照するという考えは間違っているようです。リンクしたイントロ
class Foo(object):
bar = 1
def bah(self):
print Foo.bar
f = Foo()
f.bah()
class Foo(object):
bar = 1
def bah(object_reference):
object_reference.var = Foo.bar
return object_reference.var
f = Foo()
print 'var=', f.bah()