복붙노트

[PYTHON] 타입 문제없이 파이썬리스트를 서브 클래스 화하는 방법?

PYTHON

타입 문제없이 파이썬리스트를 서브 클래스 화하는 방법?

나는 목록의 하위 클래스로서 파이썬에서 커스텀리스트 클래스를 구현하고 싶다. 모든 목록 작업에 대한 전체 유형 호환성을 얻으려면 기본 목록 클래스에서 재정의해야하는 최소한의 메서드 집합은 무엇입니까?

이 질문은 최소한 __getslice__는 오버라이드되어야한다고 제안합니다. 추가 조사를 통해 __add__ 및 __mul__도 필요합니다. 그래서 나는이 코드를 가지고있다 :

class CustomList(list):
    def __getslice__(self,i,j):
        return CustomList(list.__getslice__(self, i, j))
    def __add__(self,other):
        return CustomList(list.__add__(self,other))
    def __mul__(self,other):
        return CustomList(list.__mul__(self,other))

다음 문은 재정의 메서드가 없어도 원하는대로 작동합니다.

l = CustomList((1,2,3))
l.append(4)                       
l[0] = -1
l[0:2] = CustomList((10,11))    # type(l) is CustomList

이 명령문은 위의 클래스 정의에있는 대체 메소드와 만 작동합니다.

l3 = l + CustomList((4,5,6))    # type(l3) is CustomList
l4 = 3*l                        # type(l4) is CustomList
l5 = l[0:2]                     # type(l5) is CustomList

내가 달성하는 방법을 알지 못하는 유일한 방법은 확장 슬라이스로 올바른 유형을 반환하는 것입니다.

l6 = l[0:2:2]                   # type(l6) is list

CustomList를 16 형식으로 가져 오려면 내 클래스 정의에 무엇을 추가해야합니까?

또한 확장 슬라이스 이외의 다른 목록 작업이 있습니까? 결과는 CustomList 대신 목록 유형이됩니까?

해결법

  1. ==============================

    1.첫째, Björn Pollex의 조언 (+1)을 따르는 것이 좋습니다.

    첫째, Björn Pollex의 조언 (+1)을 따르는 것이 좋습니다.

    이 특정 문제 (유형 (l2 + l3) == CustomList)를 극복하려면 사용자 정의 __add __ ()를 구현해야합니다.

       def __add__(self, rhs):
            return CustomList(list.__add__(self, rhs))
    

    그리고 확장 슬라이스 :

        def __getitem__(self, item):
            result = list.__getitem__(self, item)
            try:
                return CustomList(result)
            except TypeError:
                return result
    

    나는 또한 추천한다 ...

    pydoc list
    

    ... 명령 프롬프트에서. 어떤 메소드가 노출을 나열하는지 확인할 수 있으며이 메소드는 어떤 것을 재정의해야하는지 알려줍니다.

  2. ==============================

    2.문서에서 다음 두 절을 읽어야합니다.

    문서에서 다음 두 절을 읽어야합니다.

    편집 : 확장 된 분할을 처리하려면 __getitem __- 메서드가 분할 객체를 처리하도록해야합니다 (여기에서 좀 더 자세히 설명합니다).

  3. from https://stackoverflow.com/questions/8180014/how-to-subclass-python-list-without-type-problems by cc-by-sa and MIT license