实例属性意外加载

时间:2012-08-08 15:37:59

标签: python

去年我学习了Python,并且正在重新开始使用新项目。我在开始的时候遇到了麻烦,经过一系列的记录后,我仍然难过。我不得不相信这很简单,但我找不到它。这是问题所在:

我在文件中设置了以下内容:

class Wrapper(object):
    def __init__(self, title=None):
        self.header = Thing("HEADER")
        if title is not None:
            self.header.content.append( Thing("TITLE", content=[str(title)]) )
        self.body = Thing("BODY")
        self.content = Thing("COMPLETE", content=[self.header, self.body])

class Thing(object):
    def __init__(self, name, content=[]):
        self.name = name
        self.content = content

然后从交互式提示中我做到:

>>> import things
>>> a = things.Wrapper("This is a title")

现在,我希望此时body的{​​{1}}属性为a个实例,其名称为Thing"BODY"组成一个空列表。我惊讶地发现它的content实际上是一个包含content实例的"TITLE"实例的列表。

a.header.content

我不能为我的生活弄清楚>>> a.header.name 'HEADER' >>> a.header.content [<test.Thing object at 0xb752290c>] >>> a.body.name 'BODY' >>> a.body.content [<test.Thing object at 0xb752290c>] >>> a.body.content[0].name 'TITLE' >>> a.body.content[0].content ['This is a title'] 是如何分配的。任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

试试这个

class Thing(object):
    def __init__(self, name, content=None):
        if content is None:
            content = []
        self.name = name
        self.content = content

[]作为默认值的问题是,当解释器首次创建函数时,默认参数仅被评估一次。对于int或其他不可变类型,这很好,但对于可变类型(列表,词典,可以在适当位置更改的任何内容),这会导致问题。发生的事情是Thing的所有实例共享相同的content

通过这种方式,您可以在每次时创建一个空列表来调用构造函数,每次都创建一个新列表。