我正在编写一个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行后面添加打印,两个打印都将显示[<__main__.TreeStructure object at 0x...>]
,这应该只发生在父对象而不是子对象上?在
不要使用
[]
作为默认值!在默认参数是在函数被定义时创建的,而不是在调用时创建的。 所以只对默认值使用不可变类型。使用整数、字符串、元组是可以的,但是如果您想要一个默认的列表或字典或任何可变的东西,那么就使用
None
并执行上面的技巧。在阅读this问题和答案,以便更好地理解这件事。在
您已经被旧样式的类(不支持描述符,例如
@property
s)所困扰。您应该使用:这样做之后,你的代码对我有用
编辑:
我正在使用python2.7进行测试。在3.x中,所有类都是新样式的。在
相关问题 更多 >
编程相关推荐