본문 바로가기

프로그래머/Python

[윤성우의 열혈 파이썬 중급편] 26. 스페셜 메소드

출처 : 윤성우의 열혈 파이썬 : 중급

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