2013-08-03 267 views
0

我创建了一个简单的类来管理相关对象的树:奇怪的Python类行为

class node(object): 
    children = list([]) 

    def __init__(self, ID, *children): 
     self.ID = ID 
     for c in children: 
      self.children.append(c) 

    def add(self, *children): 
     for c in children: 
      self.children.append(c) 

    def __str__(self): 
     return self.ID 
    def __repr__(self): 
     print self.ID, len(self.children) 


root = node('1') 
root.add(node('1.1', node('1.1.1')), 
      node('1.2')) 

for c in root.children: 
    print c 

我越来越:

1.1.1 
1.1 
1.2 

但是我期待只有1.1和1.2。我的错误是什么?

感谢, 梅德

回答

3
self.children

所指的node.children,这是一种类变量。只有您的列表的一个实例在类的所有实例中共享。

你需要使它成为一个实例变量:

class Node(object): 
    def __init__(self, id, *children): 
     self.children = [] 

此外,__str__ and __repr__应该返回按照一定的格式字符串。

+0

谢谢本德尔,你是什么意思的是__repr__应以一定的格式返回?我的理解是它在打印类时使用,因此表示输出完全在开发中,并且不遵循特定的样式。我错过了什么?我是Python新手 – DmitrySemenov

+0

@DmitrySemenov:这将有所帮助:http://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python – Blender

1

广场children = list([])__init__方法像这里面:

def __init__(self, ID, *children): 
     self.ID = ID 
     self.children = [] 
     for c in children: 
      self.children.append(c)