출처 : 윤성우의 열혈 파이썬 : 중급
26. 스페셜 메소드
t = (1, 2, 3)
len(t) # t.__len__()
itr = iter(t) # itr = t.__iter__()
for i in itr:
print(i, end = ' ')
s = str(t) # s = t.__str__()
- __ name__ , __ len__ , __iter __ , __str __ 등
- 객체 생성 시 자동으로 호출되는 메소드
- 직접 그 이름을 명시하지 않고 다른 경로를 통해서 혹은 상황에 따라 자동으로 호출되는 메소드
클래스에 스페셜 메소드 정의하기
# car_special.py
class Car:
def __init__(self, id):
self.id = id
def __len__(self):
return len(self.id)
def __str__(self):
return 'Vehicle number : ' + self.id
def main():
c = Car("32러5234")
print(len(c))
print(str(c))
main()
iterable 객체가 되게끔 하기
# car_iterable.py
class Car:
def __init__(self, id):
self.id = id
def __iter__(self):
return iter(self.id)
def main():
c = Car("32러5234")
for i in c:
print(i, end = ' ')
main()
- iterable 객체 : iter 함수에 인자로 전달 가능한 객체, 그 결과르 'iterator 객체' 반환
- 스페셜 메소드인 __iter __가 존재해야 한다
- iterator 객체 : next 함수에 인자로 전달 가능한 객체
- 스페셜 메소드인 __next __가 존재해야 한다
iterator 객체가 되게끔 하기
# my_iterator.py
class Coll:
def __init__(self, d):
self.ds = d
self.cc = 0
def __next__(self):
if len(self.ds) <= self.cc:
raise StopIteration
self.cc += 1 # __next__ 호출 횟수 증가
return self.ds[self.cc - 1]
def main():
co = Coll([1, 2, 3, 4, 5])
while True:
try:
i = next(co)
print(i, end = ' ')
except StopIteration:
break
main()
- 조건 1. 가지고 있는 값을 하나씩 반환한다
- 조건 2. 더 이상 반환할 값이 없는 경우 StopIterator 예외를 발생시킨다
iterator 객체이자 iterable 객체가 되게끔 하기
# my_iterator2.py
class Coll2:
def __init__(self, d):
self.ds = d
def __next__(self):
if len(self.ds) <= self.cc:
raise StopIteration
self.cc += 1 # __next__ 호출 횟수 증가
return self.ds[self.cc - 1]
def __iter__(self):
self.cc = 0
return self
def main():
co = Coll2([1, 2, 3, 4, 5])
for i in co:
print(i, end = ' ')
for i in co:
print(i, end = ' ')
main()
co = Coll2('hello')
itr = iter(co)
itr is co # True
'프로그래머 > Python' 카테고리의 다른 글
[윤성우의 열혈 파이썬 중급편] 28. 정보 은닉과 __dict __ (0) | 2020.12.24 |
---|---|
[윤성우의 열혈 파이썬 중급편] 27. 연산자 오버로딩 (0) | 2020.12.24 |
[윤성우의 열혈 파이썬 중급편] 25. isintance 함수와 object 클래스 (0) | 2020.12.24 |
[윤성우의 열혈 파이썬 중급편] 24. 상속 (0) | 2020.12.24 |
[윤성우의 열혈 파이썬 중급편] 23. 클래스와 객체의 본질 (0) | 2020.12.24 |