2012-09-16 3 views
2

저는 첫 번째 파이썬 프로그램을 작성 중이며 이상하게 보입니다.Python 클래스 멤버가 정적 인 것처럼 동작합니까?

내 프로그램은 다음과 같습니다

class thing: 
    listOfStrings = [] 

내가 listOfThings이 될 것으로 기대하고 있습니다 :

def main(): 
    listOfThings = [] 
    for i in range(0,3): 
    newThing = thing() 
    newThing.listOfStrings.append('newString') 
    listOfThings.append(newThing) 

것은 단순히 다음과 같습니다

listOfThings 
-thing1 
    -newString 
-thing2 
    -newString 
-thing3 
    -newString 

하지만 그 대신 내가 해요 점점 :

listOfThings 
-thing1 
    -newString 
    -newString 
    -newString 
-thing2 
    -newString 
    -newString 
    -newString 
-thing3 
    -newString 
    -newString 
    -newString 

thing.listOfStrings가 정적 인 경우 다른 언어로 볼 수 있습니다. 여기에 빠져있는 파이썬의 미묘한 점이 있습니까?

답변

4

listOfStrings은 클래스 속성입니다. 모든 인스턴스가 동일한 list

가 대신 파이썬에서 __init__

class thing: 
    def __init__(self): 
     self.listOfStrings = [] 
+0

그럼 자체 목록으로 개체를 만들려면 어떻게해야합니까? – ConditionRacer

+0

똑같은 방식으로, 'thing()'. – nneonneo

+0

@ Justin984,'thing()'처럼 말입니다. –

4

동안 속성을 추가해야합니다 공유, 클래스 범위에서 선언 된 "변수"될 클래스는 정적 클래스에 가깝다을, 속성 다른 언어로 된 회원. 클래스 이름은 thing.listOfStrings이나 인스턴스 newThing.listOfStrings을 통해 액세스 할 수 있지만 항상 동일한 속성을 참조합니다.

당신이 인스턴스가 속성 원하는 경우, __init__ 방법을 만들 :

class Thing: 
    def __init__(self): 
     self.listOfStrings = [] 

당신이 Thing()를 사용 Thing의 새로운 인스턴스를 인스턴스화 할 때마다의 __init__이 새 인스턴스에서 실행과 줄의 자신의 listOfStrings 목록.

파이썬의 동적 특성으로 인해 __init__이 인스턴스 속성을 추가 할 수있는 유일한 장소는 아닙니다 (권장 위치 임에도 불구하고). 예를 들어, 다음은 합법입니다.

class Foo: 
    pass # empty class definition 

a = Foo() 
a.x = 42 
print a.x # prints 42 

b = Foo() 
b.y = 99 
print b.x # raises AttributeError 
print b.y # prints 99 
관련 문제