안녕하세요, Warehouse입니다.
파이썬 개발자 로드맵에 따라 문법들을 정리하고 있습니다.
2022.04.27 - [CS/Python] - python 개발자 로드맵 ( developer roadmap ) 에 따라서 개발공부하기
오늘은 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의 개념을 어느정도 이해할 수 있었으면 하는 바람입니다.