我寫了一個解決數獨問題的腳本。 爲了模擬的網格的每個時隙,我已經在第一時間限定插槽和網格類這樣的(elipsed爲簡單起見完整代碼:對象子類列表到父列表中的索引
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()。例如:
g = Grid()
g[5].pos() -> returns 5, OK !
現在,我的完整劇本的作品很好,我想重構它,並且,作爲一個插槽基本上是屬於一個列表網格,我決定這將是我的插槽子類列表很好,像這樣:
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()。 初始化(名單(範圍(9)),也有一些變化,但似乎沒有任何工作 我缺少什麼
PS:?在g.index(g[5])
只是來形容,我知道這是沒有意義的。我使用這個邏輯裏面我的對象(self.pos()等)
爲什麼不使用組合繼承,有一個列表作爲一個內部屬性,並簡單地公開列表協議的所有相關方法工作正常? (像'__getitem__','__len__'等屬性) –
任何類都不應該擴展'list'。這是一個實現細節而不是模型約束。 你應該隱藏實現和使用組合;實際上,我不會在任何一個類中使用'list',特別是在'Slot'中'index(x)== x'! –
那麼,這是爲了避免我想要繼承,我的方法主要用在Slot對象中(例如:第一個版本,我在做self.values.remove(x),我一直在想做self.remove(x)等等)而不是重新定義__getitem__等將是一個矯枉過正的問題(對Lukasz的回答) –