2016-11-17 4 views
0

, 난 간단한 노드 트리 만들기 위해 내 코드 묶는거야되는 클래스 레벨에서 정의 된 배열 속성에 액세스 할 때 : 나는 self을 통해 정의 된 클래스 수준의 속성에 액세스 한재귀 오류 그래서 여기

class Node(object): 
    child = [] 
    def __init__(self,id): 
      self.id =id 
    def addChild(self,child): 
      self.child.append(child) 
    def printChildOnwards(self): 
      yield self.id 
      for x in self.child: 
        yield from x.printChildOnwards() 


firstChild = Node('1') 
secondChild = Node('2') 
thirdChild = Node('3') 
fourthChild = Node('4') 

firstChild.addChild(secondChild) 
firstChild.addChild(thirdChild) 


for x in firstChild.printChildOnwards(): 
    print(x) 

을 자신의 버전에 액세스하고 있는지 확인하십시오.

출력 : 1 2 2 2 2 ... then recursion error max depth

단순히이 self.child = []

출력과 같은 __init__ 내부를 정의 할 경우가 작동하지만 : 1 2 3

이 동작 뒤에있는 이유는 무엇입니까? __init__에 왜 이것을 포함해야합니까? 최초의 예에서

+1

사이드 노트 : 파이썬 3에있어 이후 ('수율 from' 그것을 범), 명시 적으로 object' '에서 상속 할 필요는 없습니다. 이것은 Python 2에서만 필요합니다 (새로운 스타일의 클래스 작동을 강제하는 것). 그러나 Python 3에서는 모든 클래스가 "새로운 스타일"이며 암시 적으로'object'를 상속합니다. – ShadowRanger

+0

오, 그래, 정말 고마워! –

답변

1

:

class Node(object): 

    child = [] 

    def __init__(self, id): 
     self.id = id 

child 속성이 객체를 공유 Node의 모든 단일 인스턴스를 의미 Node 클래스에 클래스 수준 속성의 printChildOnwards 호출을 통해, 따라서 모든 반복은 것입니다 단순히 같은 목록에서 계속 인쇄하십시오. 발견 한대로 __init__ 메서드에서 정의하면 각 인스턴스에 대해 인스턴스 수준 child 특성이 만들어 지므로이 인스턴스는 모두 고유하며 동일한 자식 공유 목록을 반복하지 않습니다.

id 기능을 사용하면 모든 개체의 ID (메모리 주소)를 쉽게 확인할 수 있습니다. 그것으로 당신은이 예제를 사용하여 자식 속성이 동일 함을 직접 볼 수

>>> n1 = Node(1) 
>>> n2 = Node(2) 
>>> id(n1.child) 
139928077828744 
>>> id(n2.child) 
139928077828744 

주위에 위로 고정 된 버전을 변경 :

class Node(object):    
    def __init__(self, id):  
     self.child = []    
     self.id = id    

다시 id 기능을 사용하여 한 번 더 확인 그들은 다르다는 것을 알아라.

>>> n1 = Node(1)            
>>> n2 = Node(2)                
>>> id(n1.child) 
139928077829192 
>>> id(n2.child) 
139928077828936 
+0

그래서 클래스 레벨 속성을 init에서 먼저 정의하여 서로 고유하게 지정해야합니다. –

+0

예. 방금 답변을 더 잘 보여주기 위해 업데이트했습니다. – metatoaster

+0

고맙습니다. 아프다. –