728x90
반응형
- 개요
클래스를 통해 iterable한 객체를 사용하는 방법을 알아본다
이때 다음의 2가지 방식을 사용하여 구현한다
- __next__ 매직 메서드를 오버라이드
- Generator를 사용
1) __next__ 매직 메서드를 오버라이드하여 iterable한 객체 사용
class WordSplitter:
def __init__(self, text):
self._idx = 0
self._text = text.split(' ')
def __next__(self):
try:
word = self._text[self._idx]
except IndexError:
raise StopIteration('Stop Iteration')
self._idx += 1
return word
def __repr__(self):
return f"WordSplit {self._text}"
ex1 = WordSplitter("Hello Python")
print(next(ex1))
print(next(ex1))
WordSplitter 클래스를 생성하여 Iterable한 객체를 사용한다
해당 클래스의 구성은 다음과 같다
- __init__ 매직 메서드 : 클래스의 인스턴스를 정의
- 문자열을 인자로 받아 인스턴스 생성
- 문자열의 인덱스를 0으로 초기화
- 공백을 기준으로 문자열을 분리
- __next__ 매직 메서드 : 오버라이드하여 try-catch 문을 통해 인덱스별로 분리된 문자열 반환
- __repr__ 매직 메서드 : 클래스의 인스턴스에 대한 문장 출력

코드를 실행한 결과는 위와 같다
"Hello Python"의 문자열을 공백으로 분리하고 next 메서드를 통해 iterable한 객체의 데이터를 추출한다
2) generator를 통한 iterable한 객체 사용
class WordSplitterWithGenerator:
def __init__(self, text):
self._text = text.split(' ')
def __iter__(self):
for word in self._text:
yield word
return
def __repr__(self):
return f"WordSplitWithGenerator {self._text}"
ex2 = WordSplitterWithGenerator("Hello Python")
ex3 = iter(ex2)
print(next(ex3))
print(next(ex3))
1)의 예제와 다르게 __next__ 메서드를 오버라이드하지 않고, 대신 __iter__ 메서드를 오버라이드한다
이때 오버라이드한 로직에서 yield 키워드를 사용한다
yield 키워드는 generator를 생성하기 위해 사용하는데, generator의 특징은 다음과 같다
- generator : iterator를 생성하는 함수
- generator는 next 함수와 동일하게 값을 하나씩 반환하면서 함수의 상태를 유지
- 필요에 따라 함수를 중지하고 중지한 시점에서 재개할 수 있음
- 모든 메모리를 한번에 저장하지 않고, 필요할 때마다 값을 생성하므로 효율적인 메모리 처리가 가능

코드를 실행한 결과는 위와 같다
WordSplitterWithGenerator 클래스의 인스턴스 ex2를 생성하고 iter 메서드를 통해 iterable한 ex3를 생성한다
ex3 인스턴스를 next 함수에 인자로 넘겨주어 값을 하나씩 추출한다
728x90
반응형
'Python > 파이썬 심화' 카테고리의 다른 글
| 코루틴 (1) (0) | 2025.10.12 |
|---|---|
| 제너레이터 + itertools 모듈 (0) | 2025.09.28 |
| 병행성 - 기본 (1) (0) | 2025.09.14 |
| 데코레이터 (0) | 2025.09.02 |
| 클로저 (2) (0) | 2025.08.21 |