以下是我的班级定义:
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
答案 0 :(得分:1)
cluster
类本身是可调用的:当你调用它时,它返回一个类的实例。但是,类的实例不是可调用的。但是(您可能会问)为什么您的代码甚至试图调用该类的实例?
嗯,这是因为.add_child
方法返回新的temp
实例,但它将temp.prev
属性设置为父实例self
。这会覆盖该实例的.prev
方法。因此,当您执行tree.prev()
时,它会尝试调用该父实例而不是prev
方法。
顺便提一下,cluster.__init__
方法也会将.prev
方法替换为None
。
所以你需要摆脱那个名字冲突。我建议您将该属性重命名为._prev
。
答案 1 :(得分:0)
prev
是cluster
实例tree
的一个属性(覆盖同名方法)。
cluster
的构造函数__init__
是使cluster
类可调用的原因。但是当您使用cluster
实例化__init__
类时,您将获得实例。除非您在班级中实施__call__
方法,否则此实例不可调用。
要检查一下:
callable(cluster) #Returns True
callable(tree) #Returns False