2016-08-11 4 views
-1

나는 자바에서 파이썬으로 이동하고있다. Java에서 정적 변수는 동일한 클래스의 다른 객체에 의해 변경 되더라도 클래스의 모든 객체에 동일한 값을 반환합니다. 필자는 독서중인 Python 책에서 데이터 멤버는 클래스 정의의 직접적인 범위 내에서 할당이 수행되면 클래스 네임 스페이스에 입력된다고 말합니다.클래스 변수를 사용하는이 코드가 Java에서와 같이 작동하지 않는 이유는 무엇입니까?

내가 IDLE을 사용하고, 아래의 파이썬 인터프리터, 그리고 파이썬 코드 :

class ABC: 
    OVRLIMIT_FEE=5 

>>> a=ABC() 
>>> b=ABC() 

>>> a.OVRLIMIT_FEE+=1 
>>> a.OVRLIMIT_FEE 
6 
>>> b.OVRLIMIT_FEE 
5 

그러나 클래스의 네임 스페이스를 입력하면, 그렇지 그것이 모두에 액세스 할 때 같은 값을 반환해야합니다 b?

+0

,이 문제는 그것에 전혀 관련이 – SomeJavaGuy

+1

당신이 객체가 ABC의 속성을하지 특성 변화, 할'ABC.OVRLIMIT_FEE + = 1' 당신은 얻을 것이다 6 for both – dnit13

+0

'a.OVRLIMIT_FEE' ('a.OVRLIMIT_FEE + = 1'에서했던 것처럼)에 할당하면'a'에 인스턴스 변수를 생성하게됩니다. 클래스 변수에 접근하려면'ABC.OVRLIMIT_FEE'를 사용하십시오. – khelwood

답변

0

예상되는 동작을 지원하지 않는 소위 Oldstyle 클래스를 만들었습니다. object에서 상속하여 새 스타일 클래스를 만듭니다. 그런 다음 당신이 예상대로 작동합니다 [...]

사용 a.foo += 1

  • 1
  • 을 추가 클래스 속성 foo에 소요되는 a.foo = a.foo + 1로 암시 적으로 unterstood입니다 인스턴스로 결과를두고 속성 foo. 코드

: 당신이 자바를 언급하더라도

>>> class B(object): 
... x=5 
>>> b1=B() 
>>> b2=B() 
>>> b1.x += 1 
>>> b1.__dict__ 
{'x': 6} 
>>> b2.__dict__ 
{} 
>>> B.__dict__ 
{'x': 5 ... and other stuff ... } 
+0

b2.x는 클래스 B에 대해 x가 6이기 때문에 6을 인쇄합니다. 예상대로 작동하려면 7을 인쇄하지 않아야합니까? –

+0

오, 내 점심 시간에 파이썬 질문에 대답해서는 안된다. 나는 바로 답을 바로 잡을 것이다. –