When will you grow up?

Magic method(special method)_04 본문

02. Study/Python

Magic method(special method)_04

미카이 2022. 3. 22. 09:04

이번에는 매직메소드를 알아보자.

파이썬 공식 도큐먼트(https://docs.python.org/3/reference/datamodel.html) 에는 special method라고 소개하고 있지만 상황에따라 매직메소드==스페셜메소드 동일하게 부르니 헷갈리지 말자.

 

매직 메소드(magic method)란?

클래스안에 정의할 수 있는 특정한(built-in) 메소드다.

그렇다면 built-in은 무엇인가? 내장 함수라고해서 import 과정을 필요로 하지 않는 함수들을 말한다. 

ex) abs(), chr(),divmod() etc...

 

우리가 일반적으로 변수를 선언하고 10을 더하는 코드를 작성한다고 가정하자.

1
2
3
= 10
print(n+10)
print(type(n))  # int형 이지만 class 형식으로 나온다 
cs

위와 같이 작성할 것이다.

여기서보면 내부적으로 int형 class의 add형 메소드가 실행되었다고 나올 것이다.

그렇다면 다음과 같이 변경해도 결과는 어떻게 나올까?

1
2
3
4
print(n.__add__(100)) # 같은 결과가 나온다
# print(n.__doc__) # 클래스 맨 위 """""" 형으로 감싸져있는 값이 나온다..
print(n.__bool__(), bool(n)) # True 내부적으로 __bool__이 실행된다
print(n * 100, n.__mul__(100))
cs

동일한 결과를 얻을 수 있을것이다. 

결국 built-in이기 때문에 우리가 쉽게 사용할 수 있는 것이다.

이것을 매직 메소드(스페셜 메소드)라고 부르는 이유이다.

 

 

이제 클래스를 하나 만들고 안에서 매직 메소드를 재정의하여 사용해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Fruit(object):
    def __init__(self, name, price):
        self._name = name
        self._price = price
 
    def __str__(self):
        return 'Fruit Class Info : {} , {}'.format(self._name, self._price)
 
    def __add__(self, x): # 내부적으로 class INT(object): 이런 느낌으로 클래스가 존재해서 만들어준다 ?
        #print('called __add__')
        return self._price + x._price
 
    def __sub__(self, x):
        #print('called __sub__')
        return self._price - x._price
 
    def __le__(self, x): # 대소 비교
        print('called __le__')
        if self._price <= x._price:
            return True
        else:
            return False
 
    def __ge__(self, x): # 대소 비교
        print('called __ge__')
        if self._price >= x._price:
            return True
        else:
            return False

# 인스턴스 생성
s1 = Fruit('Orange', 7500)
s2 = Fruit('Banana', 3000)
cs

위와 같이 과일의 이름과 가격을 담을 클래스를 만들고 Orange, Banana 두 가지 인스턴스를 만든다.

덧셈(__add__), 뺄셈(__sub__), 대소(__le__, __ge__) 비교 함수를 재 정의한다.

 

각 인스턴스 별 가격을 연산하는 방법을 알아보자.

만약 매직 메소드를 모른다면 아래와 같이 연산할 것이다.

1
print(s1._price + s2._price) # 이렇게 접근하면 좋지않고, 코드양도 엄청 늘어나고 가독성도 떨어진다.
cs

 

매직 메소드를 이용한다면?

1
2
3
4
print(s1 + s2) # 이렇게 계산하면 __add__ 메소드만 바꾸면 모든지 다 바꿔서 효율을 엄청 올릴 수 있다.
print(s1 - s2) # 이렇게 계산하면 __sub__에서 x 인자값에 s2가 바로 넘어간다. 또한, 인자값을 무궁무진하게 넣을 수 있다. (self, x, y.....)
print(s1 >= s2) # 이렇게 계산하면 __ge__ 호출되고 x 인자값에 s2가 바로 넘어간다.
print(s1 <= s2) # 이렇게 계산하면 __le__ 호출되고 x 인자값에 s2가 바로 넘어간다.
cs

 

 

위와같은 과정을 데이터 모델(data model)이라고 부르고

https://docs.python.org/3/reference/datamodel.html 공식 도큐먼트에서 확인가능하다.

 

 

 

 

 

우리를 위한 프로그래밍 : 파이썬 중급 를 기반으로 정리하였으며,

기본적인 내용보다는 실질적으로 Why? 라는 의문이 가질 법한 내용 위주로 정리하였습니다.

Comments