728x90


1. 스페셜 메소드

* 프로그래머가 이름을 직접 명시하여 호출하지 않더라도 상황에 따라 자동으로 호출되는 메소드이며 __name__ 과 같은 형태를 띈다.

스페셜 메소드 내용 예시
__init__ 객체 생성 시 자동으로 호출되며, 클래스의 변수를 초기화 하는 생성자 역할 class Car:
   def __init__(self, number):
      self.number = number
__len__ len 함수가 호출될 때 호출됨 len(t)
# t.__len__()
__iter__ iter 함수가 호출될 때 호출됨 itr = iter(t)
# itr = t.__iter__()
__str__ str 함수가 호출될 때 호출됨
#문자열을 반환하는 메소드가 필요할 때 오버로딩해 사용
s = str(t)
# s = t.__str__()
__call__ 객체 뒤에 ()를 붙히면 호출됨
#__call__을 오버로딩한다면 객체를 함수처럼 사용가능
acnt()
# acnt.__call__()
__add__ + 연산할 때 호출됨 acnt + 100
# acnt.__add__(100)
__iadd__ += 연산할 때 호출됨  
__sub__ - 연산할 때 호출됨 acnt - 100
# acnt.__sub__(100)
__isub__ -= 연산할 때 호출됨  

 

# 오버라이딩으로 구현해 본 iterator 객체
class Sample:
    def __init__(self, d):
        self.ds = d

    def __iter__(self):
        self.cc = 0
        print("iter")
        return self

    def __next__(self):
        if len(self.ds) <= self.cc:
            raise StopIteration
        self.cc += 1
        return self.ds[self.cc - 1]


def main():
    sp = Sample([1, 2, 3, 4, 5])
    ltr_sp = iter(sp)
    print(next(ltr_sp))  # iter 1


main()

 

# 연산자 오버로딩
class OverSpcial:
    def __init__(self, n):
        self.n = n

    def __add__(self, param):
        print("__add__호출")
        return OverSpcial(self.n + param.n)

    def __iadd__(self, param):
        print("__iadd__호출")
        self.n += param.n
        return self

    def __call__(self):
        return '__call__ 호출 : {}'.format(self.n)

    def __str__(self):
        return "__str__ 호출 : {}".format(self.n)


def main():
    os1 = OverSpcial(7)
    os2 = OverSpcial(3)
    result1 = os1 + os2  # __add__호출
    print(result1)  # __str__ 호출 : 10

    os1 += os2  # __iadd__호출
    print(os1)  # __str__ 호출 : 10

    print(os2())  # __call__ 호출 : 3
    print(os2)  # __str__ 호출 : 3


main()

 


 

728x90

+ Recent posts