Python class에서 next, iter
📑 목차 (Contents)
iter, next
- 간단하게 iter, next 메소드를 클래스에서 정의하는 방법과 그 필요성을 알아봅니다.
- iterator는 쉽게, 순차적으로 연결되어 있는 값을 의미합니다. 흔히들 리스트처럼 만들어줄때 많이 쓰게 되는데, 저는 기껏 클래스로 잘 정의한 객체를 list로 다시 만들기 위해서 일일이 지정하거나, 아니면 클래스로 만들지도 않고, 리스트로 만들어서 처리하거나 하는 일들이 많았습니다.
- 즉, 클래스를 사용해서 iterator로 간단히 말하면,
list()의 형태로 쉽게 변환하려면 메소드만 하나 추가로 정의해주면 됩니다.
let’s do it.
class TEMP(object):
def __init__(self, num_lst):
self.num_lst = num_lst
self.i = 0
def __iter__(self):
# __iter__ 메소드는 해당 클래스가 리스트 등으로 불러졌을때, 이게 어떤 값을 리턴할지를 의미함
# 따라서, 값을 만들고 해당 리스트를 iter로 감싸고 리턴함.
# 즉 안에서 유지되는 값을 iter로 묶어서 내보내면 됨.
return iter(self.num_lst)
def __next__(self):
"""
- next는 한번에 값을 다 불러서 리턴하는 것이 아니고, 하나씩 순차적으로 읽어야 함.
- 이 과정에서 지금 어디까지 일힌 것인지를 파악하는 index value가 필요함. 이 값이 self.i임.
- 또한 그 값이 일정 이상 커지면, StopIteration이라는 예외를 발생시켜야 함.
"""
if self.i<len(self.num_lst):
temp = self.num_lst[self.i]
self.i+=1
return temp
else:
raise StopIteration
a = TEMP([1, 2, 3, 4, 5])
print(list(a)) # by __iter__ method
for x in a: # by __iter__ method
print(x)
print("=="*20)
for i in range(0, 5):
print(next(a))
[1, 2, 3, 4, 5]
1
2
3
4
5
========================================
1
2
3
4
5
wrap-up
- 매우 간단한 방법입니다. next보다는 iter가 더 유용할 것 같구요.
GitHub에서 이 글의 마크다운 원본 보기 & 수정 제안src/content/posts/2019-08-10-python_class_init_next