将列表子类列入父列表的索引

时间:2016-12-07 13:03:16

标签: python list python-3.x

我写了一个解决数独问题的脚本。 为了模拟网格的每个槽,我第一次定义了像这样的Slot和Grid类(为了简单起见,完整的代码被删除了:

class Slot():
    def __init__(self,grid):
        self.grid = grid
        self.values = list(range(9))

    def pos(self):
        return self.grid.index(self)

class Grid(list):
    def __init__(self):
        for i in range(9*9):
            self.append(Slot(self))

像这样,我可以使用self.pos()和self.values()为我的Slot类定义方法。例如:

g = Grid()
g[5].pos() -> returns 5, OK !

既然我的完整脚本工作正常,我想重构它,并且,由于Slot基本上是一个属于Grid的列表,我认为我的Slot子类列表会很棒,就像这样:

class Slot(list):
    def __init__(self,grid):
        self.grid = grid
        self.append(list(range(9)))

    def pos(self):
        return self.grid.index(self)

class Grid(list):
    def __init__(self):
        for i in range(9*9):
            self.append(Slot(self))

g = Grid()
g.index(g[5]) -> returns 0, KO !

我首先尝试初始化列表,即:super()。 init (列表(范围(9)),还有一些变体,但似乎没有任何效果。 我错过了什么?

PS:g.index(g[5])只是为了描述,我知道它毫无意义。我在对象内部的方法中使用了这个逻辑(self.pos()等。)

1 个答案:

答案 0 :(得分:1)

通过使list成为Slot的子类,您还可以在list个实例之间进行比较,使用为Slot定义的逻辑(因为您没有覆盖它)

由于所有self.append(list(range(9))) 包含相同的值:

g.index()

grid只会匹配0屈服object的第一个条目作为结果。

当您继承自Slot(在第一个示例中为list时)所有实例都与Python参考中定义的不相等(除非实现了逻辑,否则)。

简而言之,如果您需要在比较时对待具有相似项目的插槽,则需要重新定义比较方法。除此之外,您可能需要重新考虑UserList的子类别,而是从collections选择{{1}}。

相关问题