python对象在initialze上有属性

时间:2016-11-13 18:57:19

标签: python

我用Python创建了一个图节点类 每个节点都有单个父节点,多个子节点和属性 实现应如下所示:

# graph_test.py
class Node(object):
    def __init__(self, name, prop={}):
        self.name = name
        self.properties = prop
        self.parent = None
        self.children = []
        print "New node:", self.name, self.properties
    def add_prop(self, k, v):
        self.properties.update({k:v})
        print "added prop:", k, v
    def add_child(self, n):
        self.children.append(n)
        n.parent = self

class Foo(object):
    def __init__(self, n):
        self.node_num = n
        self.root_node = None
        self.current_node = None
    def bas(self):
        n = Node("root")
        n.add_prop("this_prop_is", "set_only_root_node")
        self.root_node = n
        return self.root_node
    def bar(self):
        self.current_node = self.bas()
        for i in range(self.node_num):
            n = Node(str(i))
            self.current_node.add_child(n)
            self.current_node = n

if __name__ == '__main__':
    f = Foo(5)
    f.bar()

在此代码中,预计只有根节点具有其键为“this_prop_is”的属性。
但是,执行结果如下:

$ python ./graph_test.py 
New node: root {}
added prop: this_prop_is set_only_root_node
New node: 0 {'this_prop_is': 'set_only_root_node'}
New node: 1 {'this_prop_is': 'set_only_root_node'}
New node: 2 {'this_prop_is': 'set_only_root_node'}
New node: 3 {'this_prop_is': 'set_only_root_node'}
New node: 4 {'this_prop_is': 'set_only_root_node'}

即使我将其添加到节点“root”,所有节点都具有相同的密钥。

我使用python 2.7.6

我的问题是:

  • 这是一个错误吗?
  • 如果这不是错误,为什么会这样?
  • 如何解决此问题?

3 个答案:

答案 0 :(得分:2)

这不是错误。问题是c1 = cast[cast.title == 'The Pink Panther'] c2 = c1.groupby('year')[['n']].max() type(c2) 的默认值。您将其设置为空字典。但是,此空字典将通过prop引用进行复制,修改后,下次创建新self.properties = prop时,修改后的字典将用作默认值。

要解决此问题,请将None设置为默认值,并在分配属性时选中None:

Node

答案 1 :(得分:1)

这是因为Node.__init__中有一个可变的默认值。在Python中,默认值是在创建函数时确定的,并且将始终使用相同的实例。因此,每次创建新的Node并且不为其提供明确的prop参数时,它将使用相同的字典。

这通常通过使用None作为默认值来解决,并且如果参数为None,则每次在函数内创建新字典,例如通过执行self.properties = prop or {}。 (如果你给它一个空字典,这也将使用一个新字典,但这不是通常一个问题)

答案 2 :(得分:0)

props={}更改为props=None,将self.properties = prop更改为self.properties = prop or {}

这是由于Python中可变的默认参数的行为。这是一个很好的资源来阅读:http://effbot.org/zone/default-values.htm