[Python] 스페셜 메소드

1 분 소요

스페셜 메소드

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