[Python] 중급 #5-스페셜 메소드

정보구니·2021년 12월 14일
0

Python

목록 보기
15/18
post-thumbnail

스페셜 메소드


이전 시간에 iter 함수를 호출하면서 리스트 인자를 전달했다.

>>> ds = [1, 2, 3, 4]
>>> ir = iter(ds)  # iterator 객체를 얻는 방법

# iterator 객체를 통해 값을 하나씩 꺼내는 방법
>>> next(ir)  # 첫번째 값 반환
1
>>> next(ir)  # 두번째 값 반환
2
>>> next(ir)  # 세번째 값 반환
3
>>> next(ir)  # 네번째 값 반환
4

그러나 실제로는 리스트 객체 안에 존재하는 __iter__()이름의 메소드를, __next__()이름의 메소드를 간접적인 형태로 호출하는 것이다.

>>> ds = [1, 2, 3, 4]
>>> ir = ds.__iter__()  # iter 함수 호출의 실제 모습

>>> ir.__next__()  # next 함수 호출의 실제 모습
1
>>> ir.__next__()
2
>>> ir.__next__()
3
>>> ir.__next__()
4

여기서 간접적 호출이란 그 이름을 명시해서 호출하는 것이 아니라 다른 경로를 통해서 그 메소드의 호출을 유도하는 것이며,
이러한 형태의 메소드들을 가리켜 스페셜 메소드라 한다.

스페셜 메소드는 우리가 직접 사용하기 위해 만들어진 것은 아니다.



iterable 객체의 종류와 확인 방법


종류

우리는 리스트를 통해 iterator 객체를 얻을 수 있었다.

그럼 튜플이나 문자열을 통해서도 iterator 객체를 얻을 수 있을까?

얻을 수 있다!
즉, 튜플과 문자열도 iterable 객체인 것이다.

예제를 통해 확인해보도록 하겠다.

>>> td = ('one', 'two', 'three')
>>> ir = iter(td)
>>> next(ir)
'one'
>>> next(ir)
'two'
>>> next(ir)
'three'
>>> s = 'iteration'
>>> ir = iter(s)
>>> next(ir)
'i'
>>> next(ir)
't'
>>> next(ir)
'e'

확인 방법

그렇다면 iterable객체인지 확인하기 위한 방법은 무엇이 있을까?

dir 함수

첫번째로 dir 함수를 호출해 __iter__ 메소드가 존재하는지 확인해 iterable객체인지 아닌지 판단할 수 있다

>>> dir([1, 2])  # 리스트 객체 안에 있는 것들의 이름을 보아라

hassattr 함수

두번째로 hassattr 함수 호출을 통해서도 판단할 수 있다. hassattr을 사용하면 True, False를 반환해준다

>>> hasattr([1, 2], '__iter__')  # 리스트에 __iter__함수가 있나요?



🔎 참고
중급편 열혈 파이썬 story05

0개의 댓글