39.7 심사문제 질문입니다.
, 김 민석님이 작성class TimeIterator() :
def __init__(self, start, stop):
self.start = start
self.stop = stop
def __getitem__(self, index):
if index < self.stop - self.start:
hour = (self.start + index)//60//60%24
minute = (self.start + index)//60%60
second = (self.start + index)%60
return '{0:02d}:{1:02d}:{2:02d}'.format(hour, minute, second)
else:
raise IndexError
초를 계산할 때 어떤식으로 풀어야할 지 감이 안잡혀 우선 힌트를 보고 작성하였습니다.
힌트를 보니 self.start + index로 초를 구하도록 되어있던데 이 코드가 이해가 안되서 디버그로 살펴보았습니다.
__getitem__(self,index)를 한 번 지날 때마다 index가 증가하는 것을 확인했습니다.
근데 여기서 index가 0으로 초기화되어 있지도 않고 메소드를 지날 때 마다 index값이 증가하는데 이 부분이 이해가 되지 않습니다.
39.3에서도 index에 대한 초기화가 따로 되어있지 않은데 __getitem__(self,index)의 원래 문법이 이런 것인가요??
Re: 39.7 심사문제 질문입니다.
, 도장_ 관리자님이 작성UNIT 11.3의 참고
UNIT 39.3을 복습하세요.
data[0]으로 접근하면 내부적으로는 data.__getitem__(0)으로 호출됩니다.
data[2]로 접근하면 data.__getitem__(2)로 호출됩니다.
리스트가 아니라 내가 만든 객체에 대해서도 첨자 연산자 []로 접근하게 만들고 싶다면 __getitem__ 메서드를 정의해줘야 합니다.
예제 코드 안 보고 UNIT 39.3의 코드를 완벽하게 작성할 수 있을 정도가 되면 이해가 될 겁니다. 10번, 20번이라도 반복해서 작성해보는 게 좋습니다. 이터레이터를 작성하는 문법 구조 이해하기, 이터레이터를 사용하는 코드 이해하기, 두 가지가 되어야 합니다.
쉬운 개념은 아니니 연습이 필요합니다. 한 번 보고 이해하기 어렵습니다.
__getitem__은 원래 문법이 그렇습니다. UNIT 39.3 복습하세요.
https://docs.python.org/3/reference/datamodel.html#object.__getitem__
파이썬 공식 문서를 보면
object.
__getitem__
(self, key)이렇게 하라고 되어 있습니다.
따라야 하는 문법입니다.