Python TreeStructure(父级和子级)类,子级被附加到它自己的子级上?

2024-10-01 07:15:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个TreeStructure(TS)类,它允许我创建相互链接的父对象和子对象。每个TS-object都有m_parent属性,该属性由parent属性控制,而且它们还有{}列表,该列表包含父对象的所有子对象。每当我把一个孩子添加到它的父母的children列表时,它也会被添加到它自己的children列表中?以下是我所拥有的:

ROOT = "__ROOT__"

class TreeStructure:

    def __init__(self, parent=ROOT, children=[]):
        self.children = children
        self.parent = parent

    @property
    def parent(self):
        '''Returns m_parent'''
        if hasattr(self, "m_parent"):
            return self.m_parent
        else:
            return None

    @parent.setter
    def parent(self, parent=ROOT):
        '''Sets m_parent'''
        if type(parent) == type(self):
            if self.parent:
                del self.parent
            self.m_parent = parent
            self.m_parent.children.append(self)
        elif parent == ROOT:
            if self.parent:
                del self.parent
            self.m_parent = ROOT
        else:
            raise TypeError("Parent's type %s did not match objects type %s"
                            %(type(parent), type(self)))

    @parent.deleter
    def parent(self):
        '''Deletes m_parent'''
        if self.parent:
            if self.parent != ROOT:
                self.m_parent.children.remove(self)
            del self.m_parent

现在通过创建两个简单的对象,它应该可以工作了。但事实并非如此

^{pr2}$

问题出现在第25行,self.m_parent.children.append(self)。如果我在那行的两边都添加print,我会看到print(self.m_parent.children)和{}都在append行之前打印一个空列表[]。现在,如果我在append行后面添加打印,两个打印都将显示[<__main__.TreeStructure object at 0x...>],这应该只发生在父对象而不是子对象上?在


Tags: 对象self列表if属性objectdeftype
2条回答

不要使用[]作为默认值!在

>>> def bad(default=[]):
...     default.append(1)
...     print default
... 
>>> bad()
[1]
>>> bad()
[1, 1]
>>> bad()
[1, 1, 1]
>>> def good(default=None):
...     if default is None:
...             default = []
...     default.append(1)
...     print default
... 
>>> good()
[1]
>>> good()
[1]

默认参数是在函数被定义时创建的,而不是在调用时创建的。 所以只对默认值使用不可变类型。使用整数、字符串、元组是可以的,但是如果您想要一个默认的列表或字典或任何可变的东西,那么就使用None并执行上面的技巧。在

阅读this问题和答案,以便更好地理解这件事。在

您已经被旧样式的类(不支持描述符,例如@propertys)所困扰。您应该使用:

class TreeStructure(object):

这样做之后,你的代码对我有用

编辑:

我正在使用python2.7进行测试。在3.x中,所有类都是新样式的。在

相关问题 更多 >