2015-10-01 17 views
1

當我嘗試獲取我的上一個節點時出現錯誤(TypeError: 'node' object is not callable)。我究竟做錯了什麼?TypeError:'node'對象不可調用

我的節點類:

class node(object): 
    def __init__(self): 
     self.node=[] 
     self.info = None 
     self.prev = None 
     self.depth=-1 
     self.step = [] 
    def prev(self): 
     return self.prev 
    def add(self): 
     node1=node() 
     self.node.append(node1) 
     node1.prev=self 
     return node1 

我的代碼訪問prevlast_node應該有大約5的深度值):

rev = last_node 
dep = rev.depth 
revPath = [None]*(dep*4) 
for g in range(0,dep): 
    revPath[dep - (g*4) - 1] = rev.step[3] 
    revPath[dep - (g*4) - 2] = rev.step[2] 
    revPath[dep - (g*4) - 3] = rev.step[1] 
    revPath[dep - (g*4) - 4] = rev.step[0] 
    rev = rev.prev() 

附加信息:

我試圖穿越爲了看到被採取的路徑,樹倒退。 step[]價值只是抓住了一些整數。代碼也運行良好,除了prev(即,如果我拿出零件找到所採取的路徑,沒有問題)。

回答

0

您已經定義了一個名爲prev在你的類的方法,但在構造函數分配Noneself.prev,然後在add以後你有node實例再次分配給它。

因此,當您嘗試調用rev.prev()時,該方法已被覆蓋,而您實際上正嘗試調用node對象,因此出現此錯誤。

這是在Python常規(見PEP-0008)前綴私有字段(那些客戶端代碼不應該使用)用下劃線,就像這樣:

def __init__(self): 
    self._node=[] 
    self._prev = None 
    # Etc. 

這也是有風險的命名你的類中低因爲任何名爲node的變量都會遮蔽它並使其無法訪問。 Python中的約定是對類名使用Pascal大小寫(以大寫開頭)(請再次參見PEP-0008)。

+0

感謝您的快速回復。我沒有意識到讓它變得私密可能會造成或破壞看起來應該如此簡單的事情。我想我應該更多地瞭解這些類應該如何工作。 – Upgrayded

+0

@Upgrayded Python沒有私人成員的明確概念;使用領先的下劃線來表示「隱私」是很傳統的。這有助於緩解名稱衝突,就像你在這裏經歷的那樣。 –