2017-02-15 2 views
1

Ниже приведены мои определения классов:почему это говорит TypeError: «кластер» объект не вызываемая даже если вызываемая (кластер) дает истинное

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)

и пред мой ребенок узел кластера добавляется к дереву

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?

Я искал вокруг, но, похоже, не нашел ничего, что соответствовало моей ситуации

Заранее спасибо

Edit: Итак, я абсолютный новичок в Python, я бы, вероятно, привело с тем

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

Я предполагаю, что, поскольку я получаю различные места для обоих утверждений, пред было установлено нечто Но я не могу вернуться в мой родительский узел с
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__ также заменяет метод .prev на None.

Так что вам нужно избавиться от этого столкновения имени. Я предлагаю вам переименовать атрибут в ._prev.

+0

это сработало для меня. благодаря –

0

prev является атрибутом вашего cluster экземпляра tree (переопределение метода с тем же именем).

cluster конструктор __init__ - это то, что делает класс cluster вызываемым. Но когда вы создаете экземпляр класса cluster, используя __init__, вы получаете экземпляр . Этот экземпляр не может быть вызван, если вы не применяете метод __call__ в своем классе.

Чтобы проверить это:

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