2017-02-15 39 views
1

以下是我的類定義:爲什麼它說類型錯誤:「集羣」對象不是可調用,即使調用(集羣)給出真實

class logline: 
    def __init__(self,t,cmp,msg): 
     self.t = t 
     self.cmp = cmp 
     self.msg = msg 

class cluster: 
    clusters = [] 
    def __init__(self,status,log): 
     self.status = status 
     self.children = [] 
     self.eventlogs = [] 
     self.rep_msg = log.msg 
     self.addLog(log) 
     self.prev = None 
     if(status == 'root'): 
      cluster.clusters.append(self)    
    def prev(self): 
     return self.prev 
    def print_children(self): 
     for child in range(0,len(self.children)): 
      print(self.children[child].rep_msg) 
      self.children[child].print_logs() 
    def print_logs(self): 
     for log in self.eventlogs: 
       print(log.msg) 
    def add_child(self,status,log): 
     temp = cluster(status,log) 
     self.children.append(temp) 
     temp.prev=self 
     return temp 
    def addLog(self,log): 
     self.eventlogs.append(log) 

現在,樹是我的根羣集節點

tree = cluster('root',log1)

和prev是我的孩子羣集節點添加到樹

tree = tree.add_child('child',log6)

當我嘗試: tree = tree.prev() 我應該回去樹,但它給我的錯誤:

tree = tree.prev() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'cluster' object is not callable 

在另一方面: callable(cluster) 計算結果爲真

我的類定義的基礎關閉的:How can I implement a tree in Python? Are there any built in data structures in Python like in Java?

我已經四處搜索,但似乎無法找到任何符合我的情況的東西

在此先感謝

編輯: 所以,我在python絕對的初學者,我應該有可能導致與

>>> print(tree) 
<__main__.cluster object at 0x02AF8590> 
>>> print(tree.prev) 
<__main__.cluster object at 0x02AEA270> 

我假設,因爲我得到不同的位置對於這兩個陳述,prev已被設置爲 但我無法返回到我的父節點
return self.prev

+1

順便說一句,如果你在每個方法定義之後放一個空行,那麼你的代碼會更容易閱讀。此外,您應該使用[PEP-0008](https://www.python.org/dev/peps/pep-0008/)命名約定併爲您的類指定CamelCase名稱,例如'Cluster'和'Logline'或' LogLine'。 –

回答

1

cluster類本身是可調用:當你調用它,它返回類的一個實例。然而,類別的實例不是可調用的。但是(你可能會問)爲什麼你的代碼甚至試圖調用該類的實例

嗯,那是因爲.add_child方法返回新temp實例,但它設置temp.prev屬性self,父實例。並且這覆蓋了該實例的方法.prev。所以當你做tree.prev()它試圖調用該父實例,而不是prev方法。

順便提一下,cluster.__init__方法也用None取代.prev方法。

所以你需要擺脫名稱衝突。我建議您將該屬性重命名爲._prev

+0

這爲我工作。謝謝 –

0

prev是您的cluster實例tree的一個屬性(覆蓋同名的方法)。

cluster的構造函數__init__是什麼使得cluster類可調用。但是當您使用__init__實例化cluster類時,您會得到一個實例。除非在課堂中實施__call__方法,否則此實例不可調用。

要對此進行檢查:

callable(cluster) #Returns True 
callable(tree) #Returns False