소개
이 튜토리얼에서는 Python 의 시퀀스 매직 메서드 (sequence magic methods) 에 대해 다룹니다. 이러한 메서드를 사용하면 객체의 길이 얻기, 항목 접근, 슬라이싱 (slicing), 반복 등 다양한 연산에서 사용자 정의 클래스의 동작을 사용자 지정할 수 있습니다.
이 튜토리얼에서는 Python 의 시퀀스 매직 메서드 (sequence magic methods) 에 대해 다룹니다. 이러한 메서드를 사용하면 객체의 길이 얻기, 항목 접근, 슬라이싱 (slicing), 반복 등 다양한 연산에서 사용자 정의 클래스의 동작을 사용자 지정할 수 있습니다.
길이와 포함 관계 메서드는 Python 에서 객체가 len(), in, not in과 같은 내장 함수 또는 연산자와 함께 사용될 때 동작을 정의할 수 있도록 하는 특수 메서드입니다.
간단한 객체부터 시작해 보겠습니다. sequence.py에서 data 속성을 가진 MySequence라는 클래스를 생성합니다.
class MySequence:
def __init__(self, data: list):
"""주어진 데이터로 새로운 MySequence 객체를 초기화합니다."""
self.data = data
__len__ 매직 메서드는 클래스 인스턴스에 len() 함수를 적용할 때의 동작을 정의하는 데 사용됩니다.
## ... (sequence.py 의 이전 코드)
def __len__(self) -> int:
"""시퀀스의 길이를 반환합니다."""
return len(self.data)
__contains__ 매직 메서드는 클래스 인스턴스에 in 및 not in 연산자를 적용할 때의 동작을 정의하는 데 사용됩니다.
## ... (sequence.py 의 이전 코드)
def __contains__(self, item: object) -> bool:
"""시퀀스에 주어진 항목이 포함되어 있는지 확인합니다."""
return item in self.data
이제 MySequence 클래스에 대한 길이 및 포함 관계 메서드를 정의했으므로 length_containment_example.py에서 어떻게 작동하는지 살펴보겠습니다.
from sequence import MySequence
## MySequence 객체 생성
my_seq = MySequence([1, 2, 3, 4, 5])
## __len__ 매직 메서드 테스트
print(len(my_seq)) ## 출력: 5
## __contains__ 매직 메서드 테스트
print(3 in my_seq) ## 출력: True
print(3 not in my_seq) ## 출력: False
print(10 in my_seq) ## 출력: False
그런 다음 터미널에서 다음 명령을 입력하여 스크립트를 실행합니다.
python length_containment_example.py
항목 접근 메서드는 Python 에서 대괄호 표기법 []을 사용하여 접근할 때 객체가 동작을 정의할 수 있도록 하는 특수 메서드입니다.
__getitem__ 매직 메서드는 클래스 인스턴스에서 항목에 접근하기 위해 대괄호 표기법의 동작을 정의하는 데 사용됩니다.
## ... (sequence.py 의 이전 코드)
def __getitem__(self, index: int) -> object:
"""주어진 인덱스에 있는 항목을 반환합니다."""
return self.data[index]
__setitem__ 매직 메서드는 클래스 인스턴스에서 항목을 설정하기 위해 대괄호 표기법의 동작을 정의하는 데 사용됩니다.
## ... (sequence.py 의 이전 코드)
def __setitem__(self, index: int, value: object) -> None:
"""주어진 인덱스에 있는 항목을 주어진 값으로 설정합니다."""
self.data[index] = value
__delitem__ 매직 메서드는 클래스 인스턴스에 del 키워드를 적용할 때의 동작을 정의하는 데 사용됩니다.
## ... (sequence.py 의 이전 코드)
def __delitem__(self, index: int) -> None:
"""주어진 인덱스에 있는 항목을 제거합니다."""
del self.data[index]
이제 MySequence 클래스에 대한 항목 접근 메서드를 정의했으므로 item_access_example.py에서 어떻게 작동하는지 살펴보겠습니다.
from sequence import MySequence
## MySequence 객체 생성
my_seq = MySequence([1, 2, 3, 4, 5])
## __getitem__ 매직 메서드 테스트
print(my_seq[2]) ## 출력: 3
## __setitem__ 매직 메서드 테스트
my_seq[2] = 9
print(my_seq[2]) ## 출력: 9
## __delitem__ 매직 메서드 테스트
del my_seq[2]
print(len(my_seq)) ## 출력: 4
print(my_seq.data) ## 출력: [1, 2, 4, 5]
그런 다음 터미널에서 다음 명령을 입력하여 스크립트를 실행합니다.
python item_access_example.py
반복 메서드는 Python 에서 반복 프로토콜과 함께 사용될 때 객체가 동작을 정의할 수 있도록 하는 특수 메서드입니다.
__iter__ 매직 메서드는 클래스 인스턴스에 iter() 함수와 for ... in ... 루프를 적용할 때의 동작을 정의하는 데 사용됩니다.
## ... (sequence.py 의 이전 코드)
def __iter__(self):
"""시퀀스에 대한 이터레이터를 반환합니다."""
for item in self.data:
yield item
__reversed__ 매직 메서드는 클래스 인스턴스에 reversed() 함수를 적용할 때의 동작을 정의하는 데 사용됩니다.
## ... (sequence.py 의 이전 코드)
def __reversed__(self):
"""시퀀스에 대한 역 이터레이터를 반환합니다."""
return reversed(self.data)
이제 MySequence 클래스에 대한 반복 메서드를 정의했으므로 iteration_example.py에서 어떻게 작동하는지 살펴보겠습니다.
from sequence import MySequence
## MySequence 객체 생성
my_seq = MySequence([1, 2, 3, 4, 5])
## __iter__ 매직 메서드 테스트
for item in my_seq:
print(item, end=" ") ## 출력: 1 2 4 5
## __reversed__ 매직 메서드 테스트
for item in reversed(my_seq):
print(item, end=" ") ## 출력: 5 4 2 1
그런 다음 터미널에서 다음 명령을 입력하여 스크립트를 실행합니다.
python iteration_example.py
구현된 매직 메서드를 통해, 사용자 정의 MySequence 클래스는 이제 리스트 및 튜플과 같은 내장 시퀀스 타입과 유사하게 동작합니다. 이제 네이티브 Python 시퀀스처럼 사용할 수 있습니다.