<목차>
① Data Model (Object Model)이란?
② Dunder Method (Dunder Attributes)란?
▶ Dunder Method는 어디에 쓰이나?
③ Operator Overloading, 연산자 오버로딩이란?
▶ 비교연산자 ==를 재정의해보자
① Data Model (Object Model)이란?
파이썬의 데이터 모델이란, 포괄적인 개념으로 파이썬에서 데이터를 처리하는 방식을 말한다. 넓게는 iterators, functions, class와 객체 연산들의 구성을 말한다. 파이썬은 객체 연산을 할 때 Dunder Method를 사용한다.
② Dunder Method (Dunder Attributes)란?
클래스를 정의할 때 제일 먼저 만드는 생성자 __init__()를 보면, 메소드 이름 전후에 __가 있는 것을 확인할 수 있다. 이렇게 전후에 __가 있는 메소드를 Dunder Method라고 한다. Dunder이란 "Double Under"의 줄임말이다.
클래스 안에서 특별한 역할을 해, 매직 메소드라고 부르기도한다.
이 메소드는 파이썬 코드 실행의 전체에 걸쳐 있는 메소드이다.
Dunder Attributes는 클래스 안에 정의할 수 있고,
이런 Dunder Method를 사용하면 파이썬 표준 라이브러리에서 제공하는 기능을 직접 구현하지 않고도 int, str, list, repr 등 파이썬 빌트인 타입과 같은 작동을 할 수 있다.
예를 들어서, __str__과 __repr__의 역할은,
https://jiwonkoh.tistory.com/22?category=847389
▶ Dunder Method는 어디에 쓰이나?
(1) 클래스를 생성하고 빌트인 타입을 쉽게 쓰기 위해서도 사용하지만, 본인이 생성한 클래스의 객체는 빌트인 함수에 대해 연산이 안되기 때문에 클래스 내에 연산자 오버로딩을 이용해서 함수들을 다시 정의해줘야 한다.
(2) 또한 사실 파이썬 전반은 Dunder Method에 의해 구현되어있고, 우리는 알게 모르게 이를 사용하고 있다.
예를들어, == 연산자는 object.__eq__(self, other) 이라는 메소드에 의해 작동한다.
또, 타입을 변환해주는 str(a) 함수는 type(a).__str__() 에 의해 작동한다.
더 많은 예시: https://docs.python.org/3/reference/datamodel.html#data-model
③ Operator Overloading, 연산자 오버로딩이란?
동일한 Dunder Method를 정의하되 안의 내용을 바꾸어 사용하는 것이다.
파이썬에서 빌트인 함수(Built-in function), 연산자(+,-,=), 비교연산자(==, +=) 등을 사용할 때, 본인이 생성한 클래스의 객체가 작동하지 않을 때 자주 이용한다.
▶ 비교연산자 ==를 재정의해보자
class Number:
def __init__(self, number):
self.number = number
n1 = Number(1)
n2 = Number(1)
n1 == n2
# False
→ Number(1)과 Number(2)를 우리가 봤을 때는 같아보이지만,
파이썬에서는 ID가 달라 비교연산자 ==로 비교하면 False이다.
이런 문제를 해결하기 위해서 클래스 내에 Operator Overloading을 해준다.
비교연산자 == 의 Dunder method는 __eq__(self, other)이다.
def __eq__(self, other):
if isinstance(other, Number):
return self.number == other.number
return False
→ 이 오버로딩한 함수를 클래스 안에 넣어주면, 비교연산자가 우리가 원하는대로 작동한다. (= True를 리턴한다.)
'Computer Science > [20-3,4] Python Basic' 카테고리의 다른 글
[Python] Operator Overloading (3) 클래스 객체 간의 연산과 역순 연산자 (0) | 2020.04.02 |
---|---|
[Python] Operator Overloading (2) iterator 구현해보기 (0) | 2020.04.02 |
[Python] Optional Parameter에 None 주의해서 쓰기 (0) | 2020.04.01 |
[Python] 클래스 상속 (Class Inheritance)란? (0) | 2020.04.01 |
[Python] isinstance() 함수와 .isdigit()의 차이 (0) | 2020.03.27 |
댓글