python中相互依赖类中列表属性的特殊处理

python中相互依赖类中列表属性的特殊处理,python,list,class,Python,List,Class,我定义了一些基本上具有列表属性的对象,这些属性可以相互指向。比如说, class Child(object): def __init__(self, parents=[]): self.name = name self.parents = parents class Parent(object): def __init__(self, children=[]): self.name = name self.chil

我定义了一些基本上具有列表属性的对象,这些属性可以相互指向。比如说,

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
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)
由于对python比较陌生,我想知道是否有一种优雅的方法可以确保在将父对象添加到子对象的父对象列表时,子对象会自动添加到父对象的子对象列表中。类似地,当我从子对象的父对象列表中删除父对象时,应该从父对象的“子对象”属性中删除子对象引用

到目前为止,我已经求助于特殊的方法来添加和删除其他类类型的实例

比如说,

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
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)
等等

这是可行的,但我希望我可以对list对象进行子类化,并对其进行幕后管理,这样,一个不熟悉该对象的人就可以简单地在属性上使用标准的list方法,而不用担心这些特殊的类依赖性,b我可以学习如何模拟容器类型

我读了另一篇关于列表类型子类化的文章,尽管是针对属性和回调发生变化的更复杂的情况

这是一个很好的起点,还是我最好只创建如上所示的方法来添加、删除各个列表属性

编辑:

说清楚,我不是程序员,所以在你的评论中看起来很明显的东西对我来说不一定是这样。我正在研究并感谢反馈

在上面的例子中,我尝试对列表进行子分类:

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)
在我最初的儿童课程中:

class Child(object):
    def __init__(self, parents=None):
        self.name = name
        self.parents = LinkedParentList(self)

然而,这似乎不起作用,事实上setitem和delitem没有打印。我是否应该覆盖append,直接删除?

小心。通常有一个可变的默认参数是一件坏事…子类化列表似乎最容易。您必须将父类作为一个很好的复合对象,而不需要isinstance。@9000-还有collections.MutableSequence,它也可以用来创建类似列表的对象。@9000-鉴于我是python新手,当你提到使用父类作为一个很好的复合对象时,我不确定我是否理解…@Klaudikus:这不是Python特有的:“更喜欢组合而不是继承”。不同的父类不是继承在插入项中设置回链接的实现,而是从自包含的部分组成对象,例如self.children=BacklinkingListself。