본문 바로가기
카테고리 없음

[파이썬 개발자 로드맵] python dunder 와 Magic method 개념, 구현하기

by Warehaus 2022. 7. 26.

 

안녕하세요, Warehouse입니다.

파이썬 개발자 로드맵에 따라 문법들을 정리하고 있습니다.

 

2022.04.27 - [CS/Python] - python 개발자 로드맵 ( developer roadmap ) 에 따라서 개발공부하기

 

python 개발자 로드맵 ( developer roadmap ) 에 따라서 개발공부하기

예전에 DevOps 업무를 수행하기 위해서 어떤 능력이 필요한지 roadmap.sh 에서 확인해 본 적이 있다. 파이썬을 현업에서 적극적으로 사용하고 있지만 가끔 기본적인 내용에 대해 엦어버릴 때가 있는

armin.tistory.com

 

 

 

 

오늘은 dunder에 대해 알아보겠습니다.

 

 

What's Dunder?

 

처음에 이 단어를 접했을 때 무슨 의미인지 잘 몰라서 찾아보았는데,

double or magic methods in Python이라는 설명이 가장 맨 첫 검색 결과로 나왔고, 내용을 보니 Dunder는 "Double Under(Underscores)" 의 약자였습니다.

 

즉, Dunder 는 '__'라는 거죠.

 

이제 대충 무슨 얘기하는지 이해가 될 듯 말 듯합니다.

 

Dunder는  __init__, __add__, __len__ 등등 이 있습니다.

underscore (언더바) 두 개로 시작해서 두개로 끝나는 특별한 메서드를 우리는 dunder이자 Magic method 라 칭할 수 있겠습니다.

 

 

어디에 사용하나?

 

Magic method는 별도로 호출되는 메서드는 아닙니다.

 

클래스 내에서 특별한 행위가 일어났을 때 내부적으로 호출되는 메서드인데, C++의 operator를 구현한 함수와 약간은 유사하다고 볼 수 있겠습니다.

 

하나의 예시로, + operator를 이용해 숫자를 더하는 상황에서 __add__()  메서드라 호출되게 됩니다.

 

숫자를 더하는 얘기가 나왔으니 숫자 자료형에 어떤 dunder가 있는지 확인해 보시죠,

 

>>> dir(int)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']

abs, add, and 등등..

많은 dunder들이 있는 것을 볼 수 있습니다.

 

반응형

 

dunder는 앞에서 말했다시피 특정 행위가 발생하는 경우 호출이 됩니다.

그래서 너무 자연스럽게 사용되고 있는 것 같습니다.

 

직접적으로 호출해서 어떻게 동작하는지 알아보면, 다음과 같은 코드로 비교해 볼 수 있을 것 같습니다.

 

>>> a = 10
>>> type(a)
<class 'int'>
>>> a > 10
False
>>> a > 11
False
>>> a > 5
True
>>> a.__gt__(10)
False
>>> a.__gt__(11)
False
>>> a.__gt__(5)

 

>라는 operator에 의해  __gt__ dunder가 호출되고 이에 따른 결과가 나오는 것을 우리는 알 수 있습니다.

int class는 기본 자료형이라서 그냥 구현된 대로 동작하는 것 같은데, 이걸 class에 활용할 수는 없을까요?

 

 

Class에  Magic method 구현하기

 

Magic Method는 개발자가 별도로 선언 한 클래스에서도 구현 가능합니다.

아래는 __gt__  Magic method를 별도의 클래스에 구현하여 출력과 함께 greater  결과를 반환하는 Dunder 예시입니다.

 

class A :
    def __init__( self, val ):
        self.v = val

    def __gt__( self, val ):
        print ( f"{self.v} > {val}" )

        return self.v > val

if __name__ == "__main__":
    test = A(10)
    print( test > 5 )

 

가장 하단의 print ( test > 5 ) 에서 Class A의 __gt__ 가 호출되고, 이에 따라서 self.v > val 을 stdout으로 출력합니다.

그런다음 return 값을 반환하는 구현이며 실행결과는 다음과 같습니다.

 

% python3 220725_dunder.py
10 > 5
True

 

부족한 설명이지만, Dunder의 개념을 어느정도 이해할 수 있었으면 하는 바람입니다.