시퀀스 매직 메서드

PythonBeginner
지금 연습하기

소개

이 튜토리얼에서는 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__ 매직 메서드는 클래스 인스턴스에 len() 함수를 적용할 때의 동작을 정의하는 데 사용됩니다.

    ## ... (sequence.py 의 이전 코드)

    def __len__(self) -> int:
        """시퀀스의 길이를 반환합니다."""
        return len(self.data)

__contains__

__contains__ 매직 메서드는 클래스 인스턴스에 innot 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__

__getitem__ 매직 메서드는 클래스 인스턴스에서 항목에 접근하기 위해 대괄호 표기법의 동작을 정의하는 데 사용됩니다.

    ## ... (sequence.py 의 이전 코드)

    def __getitem__(self, index: int) -> object:
        """주어진 인덱스에 있는 항목을 반환합니다."""
        return self.data[index]

__setitem__

__setitem__ 매직 메서드는 클래스 인스턴스에서 항목을 설정하기 위해 대괄호 표기법의 동작을 정의하는 데 사용됩니다.

    ## ... (sequence.py 의 이전 코드)

    def __setitem__(self, index: int, value: object) -> None:
        """주어진 인덱스에 있는 항목을 주어진 값으로 설정합니다."""
        self.data[index] = value

__delitem__

__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__ 매직 메서드는 클래스 인스턴스에 iter() 함수와 for ... in ... 루프를 적용할 때의 동작을 정의하는 데 사용됩니다.

    ## ... (sequence.py 의 이전 코드)

    def __iter__(self):
        """시퀀스에 대한 이터레이터를 반환합니다."""
        for item in self.data:
            yield item

__reversed__

__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 시퀀스처럼 사용할 수 있습니다.