我正在定义一些基本上具有可以指向彼此的列表属性的对象。例如,
class Child(object):
def __init__(self, parents=[]):
self.name = name
self.parents = parents
class Parent(object):
def __init__(self, children=[]):
self.name = name
self.children = children
对于python来说相对较新,我想知道是否有一种优雅的方法可以确保将父项添加到子项的父项列表时,子项会自动添加到父项的子项列表中。类似地,当我从子父级列表中删除父级时,应该从父级的子属性中删除子级引用。
到目前为止,我已经使用特殊方法来添加和删除其他类类型的实例。
例如,
class Child(object):
def __init__(self, parents=[]):
self.name = name
self.parents = parents
def addParent(self, parent):
if isinstance(parent, Parent) and parent not in self.parents:
if self not in parent.children:
parent.children.append(self)
self.parents.append(parent)
等。
它正在工作,但我希望我可以继承子列表对象并在引擎盖下管理它,以便a)不熟悉该对象的人可以简单地使用属性上的标准列表方法而不必担心这些特殊的类依赖关系,以及b)我可以学习如何模拟容器类型。
我读了另一篇关于子类化列表类型的帖子,虽然是一个更复杂的情况,它改变了属性和回调。
How to handle innerclass attribute dependencies?
这是一个很好的起点还是我最好简单地创建如上所示的方法来添加,删除各自的列表属性?
编辑:
要说清楚,我不是程序员,所以在你的评论中看起来很明显并不一定是我的情况。我正在研究和欣赏反馈。
通过上面的例子,我尝试了子类列表:
class LinkedParentList(list):
def __init__(self, container=None):
super(LinkedParentList, self).__init__(self)
self._container = container
def __setitem__(self, index, value):
if self._container not in value.children:
value.children.append(self._container)
print 'Adding to LinkedParentList'
super(LinkedParentList, self).__setitem__(index, value)
def __delitem__(self, index):
item = self.__getitem__(index)
if self._container in item.children:
item.children.remove(self._container)
super(LinkedParentList, self).__delitem__(index)
在我原来的Child课程中:
class Child(object):
def __init__(self, parents=None):
self.name = name
self.parents = LinkedParentList(self)
但这似乎不起作用,实际上 setitem 和 delitem 不会打印。我应该改为覆盖追加,直接删除吗?