1 python parent tree-structure parent-child python-3.x
我正在编写一个TreeStructure(TS)类,它允许我创建彼此链接的父对象和子对象。每个 TS 对象都有m_parent属性,它由属性控制parent,并且它们也有children列表,它保存该父对象的所有子对象。每当我将一个孩子添加到其父母的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
Run Code Online (Sandbox Code Playgroud)
现在通过创建两个简单的对象,它应该可以工作。然而,事实并非如此。
a = TreeStructure()
b = TreeStructure(a)
Run Code Online (Sandbox Code Playgroud)
问题出现在第 25 行self.m_parent.children.append(self)。如果我将打印添加到该行的两侧,我会看到两者print(self.m_parent.children)并在附加行之前print(self.children)打印一个空列表。[]现在,如果我在附加行之后添加打印,两个打印都会说[<__main__.TreeStructure object at 0x...>],这应该只发生在父级,而不是子级?
不要用作[]默认值!
>>> 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]
Run Code Online (Sandbox Code Playgroud)
默认参数是在定义函数时创建的,而不是在调用函数时创建的。因此仅使用非可变类型作为默认值。使用整数、字符串、元组是可以的,但如果你想要一个默认列表或字典或任何可变的东西,那么使用None并执行上述技巧。
阅读此问题和答案以更好地理解此事。
| 归档时间: |
|
| 查看次数: |
3407 次 |
| 最近记录: |