스도쿠 문제를 해결하는 스크립트를 작성했습니다. 내 슬롯 클래스에 대한 방법을 정의 할 수 있습니다,이 같이부모 목록으로 서브 클래 싱하는 개체의 인덱스
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))
: 그리드의 각 슬롯을 모델링하기 위해, 나는 간단하게하기 위해 elipsed이 (전체 코드와 같은 처음 정의 슬롯 및 그리드 클래스에있는 . 예를 들어 self.pos()와 self.values ()를 사용하여 : 슬롯은 기본적으로에 속하는 목록으로
이g = Grid()
g[5].pos() -> returns 5, OK !
이제 내 전체 스크립트가 잘 작동하는지, 나는 그것을 리팩토링을 원하고, 그리드, 내 Slot to subclass 목록에서 다음과 같이 좋겠다고 결정했습니다.
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])
그냥 내가 무의미 알고 있어요, 설명하는 것입니다. 난 당신이 또한 Slot
인스턴스 사이의 비교를 Slot
list
의 서브 클래스를함으로써 내 개체 (등 self.pos())
상속을 통한 컴포지션을 사용하지 않고 내부 속성으로 목록을 작성하고 목록 프로토콜에 관련된 모든 관련 메소드를 간단히 표시하면 어떨까요? ('__getitem__','__len__' 등의 속성) –
클래스 중'list'를 확장하지 않아야합니다. 이것은 모델 제약이 아닌 구현 세부 사항입니다. 구현을 숨기고 컴포지션을 사용해야합니다. 실제로'index '(x) == x 인'Slot'에서 두 클래스 중 하나의리스트를 사용하지 않을 것입니다! –
음, 하위 클래스로 만들려고하는 것을 피하기 위해 내 메서드는 주로 Slot 객체에서 사용됩니다 (예 : 첫 번째 버전에서는 self.values.remove (x)를 수행하고 있습니다. self.remove (x)를하는 등) 대신 __getitem__ 등을 재정의하면 잔인한 행동이 될 것입니다. (Lukasz에 대한 답변) –