상위 목록: 하위 목록: 작성 날짜: 읽는 데 15 분 소요

매직 메서드(Magic Method)

매직 메서드(Magic Method)는 미리 정의되어 있는 메서드들을 재정의하여 클래스를 활용할 수 있도록 변경합니다.

내장 함수들이 처리하는 연산을 변경해 사용자 정의 클래스나 함수 등을 효율적으로 사용할 수 있습니다.

Under Score(_)를 두 번 사용해 매직 메서드를 정의할 수 있습니다.



인스턴스(Instance) 정의

class Daeheeyun:
    def __new__(cls, *args, **kwargs):
        print("인스턴스 할당")
        return super(Daeheeyun, cls).__new__(cls)

    def __init__(self, site="076923"):
        print("인스턴스 초기화")
        self.site = site
        self.link = site + ".github.io"

    def __call__(self, protocol=True):
        print("인스턴스 호출")
        if protocol == True:
            return "https://" + self.link
        else:
            return "http://" + self.link

    def __del__(self):
        print("인스턴스 소멸")


instance = Daeheeyun()
print(instance.link)
print(instance(False))
del instance
결과
인스턴스 할당
인스턴스 초기화
076923.github.io
인스턴스 호출
http://076923.github.io
인스턴스 소멸

__new__ : 할당 메서드

새로운 인스턴스를 만들기 위해 가장 먼저 호출되는 메서드입니다.

__new__에서 인스턴스를 반환하지 않는다면 __init__은 실행되지 않습니다.

즉, __new__ 메서드가 __init__ 메서드를 호출합니다.

super().__new__(cls[, ...])의 형태로 슈퍼 클래스 호출해서 반환합니다.

__new__는 일반적으로 사용되지 않으며, 불변형(int, str, tuple) 등의 서브 클래스에서 인스턴스 생성을 커스터마이징할 수 있도록 하는 데 사용됩니다.


__init__ : 초기화 메서드

새로운 인스턴스를 만들 때 사용될 인자들을 선언하는 메서드입니다.

할당된 인자들을 선언해서 사용하며, 일반적으로 매개변수를 할당받을 때 동일한 이름에 self를 추가해 동일한 명칭으로 사용합니다.


__call__ : 호출 메서드

인스턴스가 함수로 호출될 때 실행되는 메서드입니다.

__call__ 메서드가 존재하면, 호출 가능한 형식(callable type)이 되며, 함수처럼 사용할 수 있습니다.

__call__은 인스턴스를 생성한 다음 값을 할당할 수 있습니다.

반대로 __init__은 인스턴스를 생성할 때 값을 할당할 수 있습니다.


__del__ : 소멸 메서드

인스턴스가 제거될 때 호출되는 메서드입니다.

소멸자라 부르며, del 등을 통해 간접적으로 호출될 수 있습니다.

인스턴스가 삭제되기 전에 호출됩니다. 정확하게는 참조 횟수(reference count)가 0이 될 때 호출됩니다.

객체가 종료될 때 사용되는 메서드입니다.



인스턴스(Instance) 표현

class Daeheeyun:
    def __init__(self, site="076923"):
        self.site = site
        self.link = site + ".github.io"

    def __repr__(self):
        return str({"site": self.site, "link": self.link})

    def __str__(self):
        return "Daeheeyun(site = " + self.site + ", link = " + self.link + ")"

    def __format__(self, format_spec):
        return format(self.link, format_spec)

    def __bytes__(self):
        return str.encode(self.link)


instance = Daeheeyun()
print(repr(instance))
print(str(instance))
print(format(instance, ">30"))
print(bytes(instance))
결과
{‘site’: ‘076923’, ‘link’: ‘076923.github.io’}
Daeheeyun(site = 076923, link = 076923.github.io)
              076923.github.io
b’076923.github.io’


__repr__ : 형식적인 문자열 메서드

repr()을 호출해 형식적인(official) 문자열 표현에 사용됩니다.

가능한 올바른 표현식을 사용하며, 디버깅을 위해 주로 사용합니다.

명확한 정보를 담아 활용하며, 문자열 형식으로 반환해야합니다.


__str__ : 비형식적인 문자열 메서드

str()을 호출해 비형식적인(informal) 문자열 표현에 사용됩니다.

repr()과는 다르게 사용자가 이해하기 쉬운 형태로 표현할 때 사용합니다.

reprstr의 차이점을 numpy 배열로 예를 든다면 다음과 같습니다.


arr = np.array([1, 2, 3])
print(repr(arr))
print(str(arr))
결과
array([1, 2, 3])
[1 2 3]

repr()을 통해 반환된 문자열은 np.array(repr(arr))로도 바로 변환해 사용이 가능합니다.

하지만, str()을 통해 반환된 문자열은 활용할 수 없습니다.


__format__ : 포맷 형식

format()을 호출해 포맷팅(formatting)할 때 사용합니다.

포맷팅의 format_specformat()에서 지원하지 않는 사용자 임의의 형식도 생성할 수 있습니다.

예제의 >30우측 정렬, 30 너비 지정입니다.


__bytes__ : 바이트 형식

bytes()를 호출해 바이트 문자열로 변환할 때 사용합니다.

접두사 b가 추가되며, 바이트 문자열로 처리됩니다.

댓글 남기기