为什么会说TypeError:'cluster'对象即使在callable(cluster)为true时也不可调用

时间:2017-02-15 08:25:51

标签: python tree 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)

和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

2 个答案:

答案 0 :(得分:1)

cluster类本身是可调用的:当你调用它时,它返回一个类的实例。但是,类的实例不是可调用的。但是(您可能会问)为什么您的代码甚至试图调用该类的实例

嗯,这是因为.add_child方法返回新的temp实例,但它将temp.prev属性设置为父实例self。这会覆盖该实例的.prev 方法。因此,当您执行tree.prev()时,它会尝试调用该父实例而不是prev方法。

顺便提一下,cluster.__init__方法也会将.prev方法替换为None

所以你需要摆脱那个名字冲突。我建议您将该属性重命名为._prev

答案 1 :(得分:0)

prevcluster实例tree的一个属性(覆盖同名方法)。

cluster的构造函数__init__是使cluster类可调用的原因。但是当您使用cluster实例化__init__类时,您将获得实例。除非您在班级中实施__call__方法,否则此实例不可调用。

要检查一下:

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