2016-12-08 8 views
3

한 클래스의 __getitem__을 다른 목록의 동일한 인덱스에있는 항목과 합계로 만들고 싶습니다. 오버로드 된 __getitem__ 다른 인수 허용

>>> class Test(list): 
    def __init__(self): 
     self.extend([1, 2, 3]) 
    def __getitem__(self, index, other): 
     return self[index] + other[index] 
>>> t = Test() 
>>> t2 = [4, 5, 6] 

는하지만, 내 두 시도에 오류가 이어질 :

>>> t[5, t2] 
Traceback (most recent call last): 
    File "<pyshell#24>", line 1, in <module> 
    t[5, t2] 
TypeError: __getitem__() missing 1 required positional argument: 'other' 
>>> t.__getitem__(5, t2) 
Traceback (most recent call last): 
    File "<pyshell#26>", line 1, in <module> 
    t.__getitem__(5, t2) 
    File "<pyshell#17>", line 5, in __getitem__ 
    return self[index] + other[index] 
TypeError: __getitem__() missing 1 required positional argument: 'other' 

__getitem__ 여러 인수를 제공 할 수 있습니까? 그렇다면 어떻게? 그렇지 않다면 에뮬레이션 할 수있는 방법이 있습니까?

답변

2

당신이 __getitem__없는 여러 매개 변수에서 "지표"의 튜플을 얻을 수 있기 때문에 가능하다 :

class Test(list): 
    def __init__(self): 
     self.extend([1, 2, 3]) 

    def __getitem__(self, value): 
     # this makes sure that a sequence with exactly 2 elements is passed in: (thanks @ShadowRanger) 
     index, other = value 
     return super().__getitem__(index) + other[index] 

>>> t = Test() 
>>> t2 = [4, 5, 6] 
>>> t[2, t2] 
9 # 3 + 6 
>>> t[1, t2] 
7 # 2 + 5 
>>> t[0, t2] 
5 # 1 + 4 

그러나 몇 가지주의 사항이있다 : 당신은 명시 적으로 당신이 돈을 super().__getitem__를 호출 할 필요가

  • 재귀에서 끝나지 마라.
  • 일반 잘라 내기를 허용하려면 __getitem__에 전달 된 인수의 개수에주의해야합니다.
  • 이 동작은 사용자를 혼란스럽게하므로 실제로 사용하지 않는 것이 좋습니다!
+1

예상보다 많은 인수를 가지지 않도록 명시 적 색인을 건너 뛰고 시퀀스 압축 풀기 :'index, other = value'를 사용하십시오. 그것은 더 빠릅니다 (파이썬은 값싼'tuple' 패킹과 언 패킹에 최적화되어 있으며 인덱싱에는 덜 사용됩니다). 나는 이것이 이상한 데 동의한다.말로 표현하면 혼란의 위험이 있으므로 추천 할 것입니다. – ShadowRanger

+0

@ShadowRanger 게시물을 편집했습니다. 고맙습니다! – MSeifert

1

의 getItem 여러 인수를 제공 할 수 있습니까? 그렇다면 어떻게? 그렇지 않다면 에뮬레이션 할 수있는 방법이 있습니까?

왜 이것을 에뮬레이션하고 싶습니까? 당신은 "마술 방법"의 요점을 놓치고 있습니다. 파이썬은 이러한 메소드를 제공하여 연산자 오버로딩의 한 형태를 제공합니다. 다음은 파이썬 문서 섹션 3.3에서 발췌 한 내용입니다. 방법을 정의하여 (예 : 산술 연산 또는 첨자 및 슬라이스와 같은) 특수 구문으로 호출되는 특정 작업을 구현할 수

클래스 : "마법 방법을"의미에 대해 설명 특수 메소드 이름는에 사용되는 특별한 이름들. 이것은 연산자 오버로드에 대한 Python의 접근 방식으로, 언어 연산자과 관련하여 클래스가 자체 동작을 정의 할 수 있도록합니다.

(강조 광산)

는 또한,이 단일 요소를 반환 __getitem__ 예상되는 코드의 독자 클래스가 모호합니다.

@MSeifert는 이미 원하는 동작을 수행 할 수있는 방법을 제공 했으므로 솔루션을 게시하지 않겠습니다. 하지만 나만의 맞춤식 메서드를 만드는 것이 좋습니다. __getitem__ 메서드의 기능을 변경하기로 결정한 경우 최소한 이러한 변경 내용을 문서화하고 구현시 __getiem__이 정상 구현과 다른 동작을하는 것이 좋습니다.