2016-12-07 7 views
0

스도쿠 문제를 해결하는 스크립트를 작성했습니다. 내 슬롯 클래스에 대한 방법을 정의 할 수 있습니다,이 같이부모 목록으로 서브 클래 싱하는 개체의 인덱스

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 인스턴스 사이의 비교를 Slotlist의 서브 클래스를함으로써 내 개체 (등 self.pos())

+0

상속을 통한 컴포지션을 사용하지 않고 내부 속성으로 목록을 작성하고 목록 프로토콜에 관련된 모든 관련 메소드를 간단히 표시하면 어떨까요? ('__getitem__','__len__' 등의 속성) –

+0

클래스 중'list'를 확장하지 않아야합니다. 이것은 모델 제약이 아닌 구현 세부 사항입니다. 구현을 숨기고 컴포지션을 사용해야합니다. 실제로'index '(x) == x 인'Slot'에서 두 클래스 중 하나의리스트를 사용하지 않을 것입니다! –

+0

음, 하위 클래스로 만들려고하는 것을 피하기 위해 내 메서드는 주로 Slot 객체에서 사용됩니다 (예 : 첫 번째 버전에서는 self.values.remove (x)를 수행하고 있습니다. self.remove (x)를하는 등) 대신 __getitem__ 등을 재정의하면 잔인한 행동이 될 것입니다. (Lukasz에 대한 답변) –

답변

1

내부 방법이 논리를 사용하고 당신 때문에 (list들에 대해 정의 된 논리를 사용 그것을 오버라이드하지 않았다.)

모두 Slot에는 s AME 값 :

self.append(list(range(9))) 

g.index()는 단순히 첫 번째 항목 결과로 0을 맺는 grid 일치합니다.

object (첫 번째 예제에서는 Slot)에서 상속 받았을 때 모든 인스턴스는 파이썬 참조에 정의 된대로 다른 인스턴스와 비교됩니다 (그렇지 않으면 논리를 구현하지 않는 한).

간단히 말해서 비교할 때 비슷한 항목이있는 슬롯을 다르게 처리해야하는 경우 비교 방법을 다시 정의해야합니다. 그 외에도 하위 분류를 list에서 다시 생각하고 UserListcollections에서 선택하는 것이 좋습니다.

+0

이 설명에 감사드립니다. 이것은 제가 찾고 있던 것입니다.내 코드가 가능한 한 "파이썬"이되도록 귀하의 충고는 무엇입니까 ?-) 첫 번째 구현을 유지하거나 비교 논리를 무시 하시겠습니까? –

+1

@ Lapin-Blanc'Slot's *이리스트처럼 동작해야한다면'리스트 '를 하위 클래스로 분류하는 것이 나에게 의미가있다. (컴포지션은 다른 사람들이 주장한 것처럼 덜 엉뚱한 대안 일 수있다.) 하위 분류를 고수한다면이 시나리오에서 더 잘 동작하기 때문에'collections.UserList'에서 상속받는 것이 좋습니다. 나는 필자가 필요로하는 것처럼 행동을 비교하는 것을 재정의 할 뿐이다. –

+0

감사합니다. 내 알고리즘은 슬롯 객체에서 가능한 값 제거를 기반으로 한 목록을 하위 클래스로 만들려고합니다. 하나의 값만 남을 때까지 솔루션의 마지막입니다. Btw, 내가 더 질문 할 수 있다면 "잘 동작한다"는 것은 무엇을 의미합니까? –

관련 문제