2013-07-03 5 views
0

루프 내 클래스의 인스턴스를 여러 개 만들고 루프가 독립적 일 것을 기대합니다. 하지만 혼란 스럽지만 동일한 이름으로 새 인스턴스를 만들 때 이전에 만든 인스턴스의 속성을 유지합니다.클래스 인스턴스에 대한 혼란

그래서 내가 좋아하는 뭔가가 : 그래서 그것은 루프 1 시간

class myClass(object): 
    def __init__(self, i1 = None, i2 = 'X', p1 = [], p2 = []): 
     self.i1, self.i2 = i1,i2 
     self.property1 = p1 
     self.property2 = p2 

    def doStuff(self):   
     self.property1.append(self.i1) 
     self.property2.append(self.i2) 
     print self.property1 
     print self.property2 

class mySubClass(myClass): 
    def __init__(self, i1 = None, i2 = 'Z'): 
     myClass.__init__(self, i1, i2) 



inputTuples = (('A', 'B'), ('D', 'E')) 

for x,y in inputTuples: 
    o=mySubClass(x) 
    pprint(vars(o)) 
    o.doStuff() 
    print(id(o)) 


{'i1': 'A', 'i2': 'Z', 'property1': [], 'property2': []} 
['A'] 
['Z'] 
37087832 
{'i1': 'D', 'i2': 'Z', 'property1': ['A'], 'property2': ['Z']} 
['A', 'D'] 
['Z', 'Z'] 
37088392 

를 pprint는 o.property1 = 두 번째로 [] , 그것을 가지고 무엇의 목록입니다 o.property1 보여줍니다 루프의 첫 번째 실행에서 o에 추가됩니다.

나의 이해는 내가 O = myClass가()를 호출 할 때, 그 클래스의 새로운 인스턴스가 생성 될 것이며, 이전 한 (효과적으로 overwrtitten)

가 가

사람이 나에게 설명 할 수 파이썬 여기에 작동하는 방법 삭제됩니다했다 어떻게 내가 원하는대로 작동하게 할 수 있을까? 내가

class myClass(object): 
    def __init__(self, i1 = None, i2 = 'X': 
     self.i1, self.i2 = i1,i2 
     self.property1 = [] 
     self.property2 = [] 

에 클래스를 변경하는 경우

그것은 내가 여기에 근본적인 차이를 이해 해달라고

{'i1': 'A', 'i2': 'Z', 'property1': [], 'property2': []} 
['A'] 
['Z'] 
37087832 
{'i1': 'D', 'i2': 'Z', 'property1': [], 'property2': []} 
['D'] 
['Z'] 
37088392 

잘 작동합니다. 또한 p1과 p2를 입력 변수로 가질 가능성을 어떻게 유지하면서 원하는 동작을 계속 유지할 수 있습니까?

+7

이 코드는 실제로 실행 가능하지 않으며 실제 코드가하는 것을 이해하기 어렵습니다. 질문을 보여주는 [SSCCE] (http://sscce.org)를 만드십시오. – abarnert

+4

필자가 작성한 코드가 이것을 반영하지는 않지만 클래스 변수를 실제로 사용하고 있다고 생각한다. 여기에 표시 한'self.property1 = []'이 아니다. 그것들은 실제로 클래스 인스턴스간에 공유됩니다. 하지만 우리가 실제로 무엇을 가지고 있는지를 알기 위해서 실제로 재현 할 수있는 예제를 만들어야합니다. –

+0

클래스 ('myClass()')를 인스턴스화 할 때마다 새로운 객체를 생성하므로 "덮어 쓰지"않습니다. 그 클래스의 다른 인스턴스들. – astephenb

답변

3

코드를 실제로 실행 가능하도록 수정했으며 루프를 통해 매번 o 개체의 ID를 표시했습니다. 분명히 관계없는 모든 것을 제거하는 것이 낫겠지 만, 아마도 이것은 당신이 더 쉽게 이해할 수있을 것입니다.

from pprint import pprint 

def f(x, y): 
    return x+y 

class myClass(object): 
    def __init__(self, i1,i2,i3): 
     self.i1, self.i2, self.i3 = i1,i2,i3 
     self.property1 =[] 

    def doStuff(self): 
     someValue = f(self.i1,self.i2) 
     self.property1.append(someValue) 

inputTuples = ((1, 2, 3), (4, 5, 6)) 

for x,y,z in inputTuples: 
    o=myClass(i1=x,i2=y,i3=z) 
    pprint(vars(o)) 
    o.doStuff() 
    print(id(o)) 

이 실행

, 당신은 다음과 같은 결과물을 출력 할 것 볼 수 있습니다 :

{'i1': 1, 'i2': 2, 'i3': 3, 'property1': []} 
4302258000 
{'i1': 4, 'i2': 5, 'i3': 6, 'property1': []} 
4302258064 

즉를, 각 연속 o 인스턴스는 서로 다른 특성을 가지고 있으며, 또한 다른 개체입니다. 파이썬은 실제로 매번 루프를 통해 새로운 o을 생성합니다.

이전 인스턴스를 즉시 파괴 할 수도 있고 그렇지 않을 수도 있습니다. *하지만 걱정하지 않아도됩니다. "결국"그것을 파괴 할 것이고 그렇게 할 수있는 충분한 일을 할 것입니다. 그래서 여러분은 그것을 잊을 수 있습니다.


*이 특정 코드로 CPython은 이전 인스턴스를 즉시 파괴합니다. PyPy, Jython 및 IronPython은 보통 다음 컬렉터 패스에서 파괴하지만 일부는 다음 패스에서 이동 또는 표시하고 파괴 할 수 있습니다.

관련 문제