我写了一个解决数独问题的脚本。 为了模拟网格的每个槽,我第一次定义了像这样的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()等。)
答案 0 :(得分:1)
通过使list
成为Slot
的子类,您还可以在list
个实例之间进行比较,使用为Slot
定义的逻辑(因为您没有覆盖它)
由于所有self.append(list(range(9)))
包含相同的值:
g.index()
grid
只会匹配0
屈服object
的第一个条目作为结果。
当您继承自Slot
(在第一个示例中为list
时)所有实例都与Python参考中定义的不相等(除非实现了逻辑,否则)。
简而言之,如果您需要在比较时对待具有相似项目的插槽,则需要重新定义比较方法。除此之外,您可能需要重新考虑UserList
的子类别,而是从collections
选择{{1}}。