파이썬에서 __getitem() 메서드의 역할을 알기 전에 먼저, Sequence 객체와 Mapping 객체가 무엇인지 알아야 한다.
Sequence 객체
-> [여러 요소(element)]로 이루어진 [순서 있는] 데이터 컬렉션을 나타냅니다.
(쉽게 생각을 하면, INDEX로 접근이 가능한 객체라고 생각하면 될 듯)
(파이썬에서의 시퀀스 객체는 문자열, 리스트, 튜플 등이 있다)
- 문자열(String): 문자들의 순서 있는 집합입니다. 예를 들어 "hello"나 "python"과 같은 것들이 문자열 시퀀스의 예시입니다. 문자열은 개별 문자의 시퀀스로 이루어져 있습니다.
- 리스트(List): 값들의 순서 있는 목록입니다. [1, 2, 3]이나 ['apple', 'banana', 'orange']와 같은 것들이 리스트의 예시입니다. 리스트는 다양한 자료형의 요소를 포함할 수 있습니다.
- 튜플(Tuple): 리스트와 유사하지만, 불변(immutable)한 시퀀스입니다. (1, 2, 3)이나 ('a', 'b', 'c')와 같은 것들이 튜플의 예시입니다.
- 범위(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__()은 동작하지 않는다.
'프로그래밍 언어 (プログラミング言語) > 파이썬' 카테고리의 다른 글
plt.ylim(), plt.legend(), plt.plot(Feat. Matplotlib) (0) | 2024.02.19 |
---|---|
컴퓨터 비전과 딥러닝 P255(Matplotlib 관련 코드 설명) (0) | 2024.02.16 |
아나콘다(anadonda)를 사용하는 이유! (1) | 2023.12.21 |
List vs Array(Numpy) (0) | 2023.11.16 |