답변:
또는 대신 bar
사용하십시오 . 에 할당 하면 정적 변수가 생성되고에 할당 하면 인스턴스 변수가 생성됩니다.self.bar
Foo.bar
Foo.bar
self.bar
클래스 메소드를 정의하십시오.
class Foo(object):
bar = 1
@classmethod
def bah(cls):
print cls.bar
이제 bah()
인스턴스 메소드 여야하는 경우 (즉, 자체에 액세스 할 수있는 경우) 클래스 변수에 직접 액세스 할 수 있습니다.
class Foo(object):
bar = 1
def bah(self):
print self.bar
모든 좋은 예와 마찬가지로 실제로 수행하려는 작업을 단순화했습니다. 이것은 좋지만 파이썬이 클래스 변수와 인스턴스 변수에 관해서 는 많은 유연성을 가지고 있음을 주목할 가치가 있습니다. 방법에 대해서도 마찬가지입니다. 좋은 가능성 목록을 보려면 Michael Fötsch의 새로운 스타일의 수업 소개 , 특히 2-6 절을 읽는 것이 좋습니다 .
시작할 때 기억해야 할 많은 작업 중 하나는 파이썬이 자바가 아니라는 것입니다. 진부한 것 이상. Java에서는 전체 클래스가 컴파일되어 네임 스페이스 확인이 간단 해집니다. 메소드 외부 (어디서나) 외부에 선언 된 모든 변수는 인스턴스 (또는 정적 인 경우) 변수이며 메소드 내에서 암시 적으로 액세스 할 수 있습니다.
파이썬에서 가장 중요한 규칙은 변수에 대해 순서대로 검색되는 세 개의 네임 스페이스가 있다는 것입니다.
{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(object_reference):
object_reference.var = Foo.bar
return object_reference.var
f = Foo()
print 'var=', f.bah()