top of page

꼭 알고 있어야 하는 파이썬 (Python)의 11가지 매직 메소드 (Magic Method)를 알아보자

파이썬 (Python)에는 클래스의 빌트인 함수 처럼 만들어주는 매직 메소드 들이 있습니다. 이 메소드는 앞뒤에 각각 언더바 두개 (__)가 존재하여서 dunder 메소드라고도 불리웁니다.


이 매직 메소드는 오퍼레이터를 오버라이드 할 수 있게도 합니다. 다음의 예제를 보셨을 텐데요, * 오퍼레이터를 오버라이드 하여 string일 경우에는 세번 반복이 되게하죠.

이 포스팅에서는 간단한 Vector2D 클래스를 만든후 여러 매직 메소드를 알아보겠습니다.



1. __init__

다음의 Vector2D 클래스가 있습니다

클래스를 만들고 객체를 instantiate 하고 나면 다음과 같은 방법으로 attribute를 추가 할수 있습니다.

그러나, 수동으로 매번 attribute를 넣는 것 보다 이런 모든 attribute를 객체가 생성될시에 initialize 할 수 있습니다


그렇게 하기 위해서는 __init__ 메소드를 지정하죠. 다음의 예제와 같이 지정을 합니다.


2. __repr__

Instantiated 된 객체를 프린트하려고 하면 다음의 코드와 같이 찍으면 도움되는 객체의 정보는 보이지 않습니다.


Output >>> <__main__.Vector2D object at 0x7d2fcfaf0ac0>

이럴 시에 이 객체를 대표하는 string이 필요합니다. 이 부부을 도와주는 메소드는 __repr__ 입니다. repr은 representation을 줄인 단어로 대표라는 뜻을 가지고 있는 영어 단어이죠.


Output >>> Vector2D(x=3, y=5)

__repr__ 메소드는 쉬운 디버깅을 위해 객체에 관한 중요한 정보가 지정이 되어야 합니다.



3. __str__

__str__ (string)은 __repr__ 과 비슷하게 대표 정보를 보여주는 용도로 사용 됩니다. __str__ 은 대부분 클래스를 사용하는 엔드유저에게 정보를 보여주는 역할을 합니다.


Output >>> Vector2D(x=3, y=5)

__str__ 이 지정이 안 되어 있으면 __repr__ 메소드를 이용하게 됩니다. 그래서 모든 클래스에는 적어도 __repr__ 메소드는 지정이 되어야 합니다.



4. __eq__

다음은 Vector2D 클래스 두개의 객체가 같은지 확인하는 메소드입니다. 이 예제는 각 객체마다 x와 y coordinate가 있습니다.

결과는 False로 나옵니다. 이유는 메모리에 있는 각 객체의 ID가 달라서이죠.

Output >>> False

다음의 예제를 이용하여 __eq__ 메소드를 추가 합니다. 여기엣 eq는 영어의 equality이란 뜻입니다. 그래서 equality를 지정하는 메소드이죠.

Equality 체크는 다음과 같이 같다고 나옵니다:


Output >>> True 

5. __len__

파이썬의 len() 함수는 배열기반의 객체의 length를 리턴합니다. 아래의 예제는 벡터의 length를 포함되어 있는 엘리먼트의 수를 리턴하게 __len__ (length) 메소드 지정합니다.


Output >>> 2

6. __add__

__add__ (addition) 메소드를 지정하면 두 벡터를 더하는 방법을 지정할 수 있습니다

결과는:


Output >>> Vector2D(x=4, y=7)

7. __sub__

__sub__ (subtraction) 메소드는 빼는 방법을 지정합니다.


Output >>> Vector2D(x=2, y=3)

8. __mul__

__mul__ (multiplication) 메소드는 곱하는 방법을 지정합니다.

__mul__ 메소드를 사용한 결과는 다음과 같습니다.


Output >>>

Vector2D(x=6, y=10)
13

9. __getitem__

__getitem__ (get item) 메소드는 [] 안의 인덱스를 사용하여 위치를 찾아서 값을 리턴합니다. 지정이 안되어 있는 경우에는 다음과 같은 오류가 납니다.


-----------------------------------------------------------------------

TypeError                             	Traceback (most recent call last)

 in ()
----> 1 print(v[0],v[1])

TypeError: 'Vector2D' object is not subscriptable

__getitem__을 지정한 후:

다음과 같이 사용이 가능해 집니다.


Output >>>

3
5


10. __call__

__call__ 메소드를 지정하면 객체를 함수같이 부를 수 있습니다.

3을 파라미터로 넣어서 객체를 부르게 되면 다음과 같이 3배가 커진 벡터를 가지고 오게 됩니다.


Output >>> Vector2D(x=9, y=15)


11. __getattr__

__getattr__ (get attribute) 메소드는 객체의 어떠한 attribute를 불러오게 하여 줍니다.


예를 들어, 다음과 같이 __getattr__ dunder 메소드를 불러 L2-norm을 계산합니다.

다음의 결과가 보여집니다.


Output >>> 5.0


참고:




Comments


pngegg (11)_result.webp

<Raank:랑크 /> 구독 하기 : Subscribe

감사합니다! : Thanks for submitting!

bottom of page