2012-05-22 39 views
1

我正在製作一個python腳本來從sqlite數據庫中爲網絡路徑提取數據。 我有兩類:節點,鏈接:在python中訪問嵌套類(循環引用?)

class node: 
     nodeName = str() 
     nodeType = str() 
     node1 = str() 
     node2 = str() 
     active = 0 

     def __init__(self, nodeID): 
      self.nodeID = nodeID 
      cursor = network.execute("SELECT linkID FROM link WHERE nodeA = ? OR nodeB = ?", (nodeID, nodeID,)) 
      row1 = cursor.fetchone() 
      row2 = cursor.fetchone() 
      if row1: 
       self.link1 = link(row1[0]) 
      if row2: 
       self.link2 = link(row2[0]) 
      self.nodeName, selfsnodeType, self.active = network.execute("SELECT nodeName, nodeType, active FROM node WHERE nodeID = ?", (nodeID,)).fetchall()[0] 

鏈接是完全一樣的,但它試圖讓兩個節點的孩子。正如你所看到的,這會創建一個循環引用,但是看起來好像有三個層次,鏈接子節點不會獲得自己的節點子節點,節點子節點也不會獲得鏈接子節點。嘗試讀取值返回無類型:

NODE object 67 getting link children: 
(19,) 
(48,) 
link object 19 getting node childs: 
(67,) 
(112,) 
NODE object 67 getting link children: 
None 
None 
  • 這種行爲是設計?
  • 這是一個壞主意嗎?
  • 是否有可能遍歷兒童?

回答

1

是的,這是不好的設計。

您只需要存儲邊以構建圖。因此,您應該通過從數據庫中提取邊來構建圖。

之後,或者同時,您應該提取裝飾節點所需的信息(以及裝飾邊緣的邊緣)。這不應該觸發任何試圖從數據庫中提取有關邊緣(除裝飾信息之外)的信息。

+0

我最終只是將ID存儲在變量中,而不是讓它們成爲它們自己的對象,這樣我可以調用x = node(y.node1)來獲取新實例 – bVector