[Python] 스페셜 메소드
스페셜 메소드
name 과 같은 형식을 가지면서 파이썬에 의해 호출되는(프로그래머가 그 이름을 직접 명시하여 호출하지 않는) 메소드를 가리켜 ‘스페셜 메소드’라 한다.
가장 대표적인 스페셜 메소드는 __init__이 있다. 이는 객체 생성 시 자동으로 호출되는 메소드이다.
>>> t = (1,2,3)
>>> t.__len__() # len(t)
3
>>> itr = t.__tier__() # itr = iter(t)
>>> for i in itr:
print(i, end = ' ')
1 2 3
>>> s = t.__str__() # s = str(t)
>>> s
'(1, 2, 3)'
또 위 코드와 같은 스페셜 메소드가 있다. 간접적으로 호출해본 메소드들이다.
클래스에 스페셜 메소드 정의하기
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()
7
Vehicle numer : 32러5234
iterable 객체가 되게끔 하기
iterable 객체 : iter함수에 인자로 전달 가능한 객체, 그 결과로 ‘iterator 객체’ 반환 iterator 객체 : next 함수에 인자로 전달 가능한 객체
iterable 객체의 조건 : 스페셜 메소드 iter 존재 iterator 객체의 조건 : 스페셜 메소드 next 존재
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()
3 2 러 5 2 3 4
iterator 객체가 되게끔 하기
class Coll:
def __init__(self, d):
self.ds = d
self.cc = 0 # next 호출 횟수
def __next__(self):
if len(self.ds) <= self.cc:
raise StopIteration
self.cc += 1
return self.ds[self.cc - 1]
def main():
co = Coll([1, 2, 3, 4, 5]) # 튜플 및 문자열도 전달할 수 있음
while True:
try:
i = next(co) # iterator 객체를 통해서 하나씩 꺼낸다.
print(i, end = ' ')
except StopIteration: # 더 이상 꺼낼 객체가 없으면,
break # 이 루프를 탈출한다.
main()
1 2 3 4 5
iterator 객체이자 iterable 객체가 되게끔 하기
class Coll2:
def __init__(self, d):
self.ds = d
def __next__(self):
if len(self.ds) <= self.cc:
raise StopIteration
self.cc += 1
return self.ds[self.cc - 1]
def __iter__(self):
self.cc = 0 # next 호출 횟수 초기화
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()
1 2 3 4 5 1 2 3 4 5