일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 | 31 |
- #일상영어
- #실생활 영어
- TensorFlow
- #프로젝트
- 이미지 생성
- 영어
- #영어
- tensorflow update
- #1일1영어
- #영어 명언
- #Android
- tokenizing
- 영어명언
- convexhull
- Convolution Neural Network
- 딥러닝
- opencv SURF
- keras
- object detection
- #실생활영어
- python __init__
- 완전탐색
- #opencv
- #English
- word embedding
- findContours
- c언어
- python list
- python 알고리즘
- text2img
- Today
- Total
When will you grow up?
Magic method(special method)_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
|
n = 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)이라고 부르고
우리를 위한 프로그래밍 : 파이썬 중급 를 기반으로 정리하였으며,
기본적인 내용보다는 실질적으로 Why? 라는 의문이 가질 법한 내용 위주로 정리하였습니다.
'02. Study > Python' 카테고리의 다른 글
파이썬 시퀀스(python sequence)_05 (0) | 2022.03.22 |
---|---|
(class, instance, static) method_03 (0) | 2022.03.21 |
클래스 변수 & 인스턴스 변수([Class,Instance] variable)_02 (0) | 2022.03.21 |
클래스&메소드(class&method)_01 (0) | 2022.03.21 |
python break, pass, continue 차이점 (0) | 2019.10.15 |