본문 바로가기

프로그래밍 언어 (プログラミング言語)/파이썬

__getitem__()(Feat. 시퀀스(Sequence) 객체, 매핑(Mapping) 객체)

파이썬에서 __getitem() 메서드의 역할을 알기 전에 먼저, Sequence 객체와 Mapping 객체가 무엇인지 알아야 한다. 

Sequence 객체

-> [여러 요소(element)]로 이루어진 [순서 있는] 데이터 컬렉션을 나타냅니다.

(쉽게 생각을 하면, INDEX로 접근이 가능한 객체라고 생각하면 될 듯)

(파이썬에서의 시퀀스 객체는 문자열, 리스트, 튜플 등이 있다)

  1. 문자열(String): 문자들의 순서 있는 집합입니다. 예를 들어 "hello"나 "python"과 같은 것들이 문자열 시퀀스의 예시입니다. 문자열은 개별 문자의 시퀀스로 이루어져 있습니다.
  2. 리스트(List): 값들의 순서 있는 목록입니다. [1, 2, 3]이나 ['apple', 'banana', 'orange']와 같은 것들이 리스트의 예시입니다. 리스트는 다양한 자료형의 요소를 포함할 수 있습니다.
  3. 튜플(Tuple): 리스트와 유사하지만, 불변(immutable)한 시퀀스입니다. (1, 2, 3)이나 ('a', 'b', 'c')와 같은 것들이 튜플의 예시입니다.
  4. 범위(Range): 숫자들의 시퀀스를 나타내는 객체입니다. range(5)는 0부터 4까지의 정수로 이루어진 시퀀스를 나타냅니다.

-> 이러한 시퀀스 객체들은 INDEX를 사용하여 개별 요소에 접근할 수 있고, 슬라이싱을 통해 부분 시퀀스를 추출할 수 있

습니다.

 

 

Mapping 객체(주로, 딕셔너리 객체)

키(key)값(value)으로 이루어진 데이터의 집합

(쉽게 생각해서, KEY로 접근할 수 있는 객체라고 생각하면 될 듯)

 

자, 이제 그럼 __getitem__() 메서드가 뭔지를 알아 보자

결론부터 말하자면,  파이썬 클래스에서 시퀀스(리스트, 튜플 등) 객체매핑(딕셔너리) 객체로부터 원소(element)를 가져

오는데 사용되는 메서드이다. 

(아래의 예시 코드를 참조)

class CustomList:
    def __init__(self, *args):
        self._data = list(args)

    def __getitem__(self, index):
        return self._data[index]

    def __len__(self):
        return len(self._data)

# 사용 예시
custom_list = CustomList(1, 2, 3, 4, 5)
print(custom_list[0])  # INDEX를 통한 접근
print(custom_list[2])  # INDEX를 통한 접근
print(len(custom_list))  # 길이 확인

 

__getitem__()의 장점 1 

-> 해당 클래스(custom_list)의 인스턴스가 Sequence 객체처럼 동작하도록 만들 수 있습니다.

Sequence 객체를 위에서 설명하면서 "쉽게 말해서 INDEX로 접근할 수 있는 객체"라고 설명을 하였다. 

위 코드를 자세히 보면, 해당 클래스의 인스턴스인 custom_list는 "custom_list[0]"과 같이 마치 INDEX를 사용하는 

Sequence 객체처럼 동작을 하고 있다. 

 

__getitem__()의 장점 2 

-> __getitem__() 메서드를 구현한 클래스의 인스턴스는 INDEX,슬라이싱를 사용하여 내부 데이터에 접근할 수 있다.

(아래 코드 블럭을 참조)

class CustomList:
    def __init__(self, *args):
        self._data = list(args)

    def __getitem__(self, index):
    
        # INDEX를 사용하여 한 개의 VALUE에 접근
        if isinstance(index, int):
            return self._data[index]
            
        # 슬라이스를 사용하여 부분 Sequence에 접근
        elif isinstance(index, slice):
            #아래의 다른 코드 블럭에서 Sequence객체[start:stop:step]의 코드를 참조
            start = index.start if index.start is not None else 0
            stop = index.stop if index.stop is not None else len(self._data)
            step = index.step if index.step is not None else 1
            return self._data[start:stop:step]
        else:
            raise TypeError("Index must be integer or slice")

    def __len__(self):
        return len(self._data)

# 사용 예시
custom_list = CustomList(1, 2, 3, 4, 5)
print(custom_list[0])        # 인덱스를 통한 단일 항목 접근
print(custom_list[1:4])      # 슬라이싱을 통한 부분 시퀀스 접근
print(custom_list[-1])       # 음수 인덱스를 통한 역순 접근
print(custom_list[::-1])     # 슬라이싱을 통한 역순 시퀀스 접근
data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
sliced_data = data[::2]  # 모든 요소를 포함하되, 2개씩 건너뛰며 슬라이싱
print(sliced_data)  # 출력: [0, 2, 4, 6, 8]

 

참고로, 위와 같이 INDEXing이나 Slicing을 하지 않으면 __getitem__()은 동작하지 않는다.