파이썬에서 클래스를 사용할 때 미리 정의된 메소드를 사용할 수 있는데 미리 정의된 메소드를 매직 메소드라고 한다. 항상 두개의 밑줄로 둘러싸여있다.__init__
, __main__
보통 연산자(+
,-
,*
,/
)의 동작을 정의할 때 가장 자주 사용된다.
가장 큰 이유는 매직 메소드를 사용하면 우리가 생성한 클래스를 아주 쉽게 파이썬의 내장함수처럼 동작하도록 만들수 있다. 물론 매직 메소드를 사용하지 않고 만들 수는 있지만, 이미 만들어진 아주 쉬운 방법이 있는데 굳이 어려운 길을 선택할 필요는 없다.
# 매직 메소드를 사용하지 않았을 때
dict1 = {1 : "ABC"}
dict2 = {2 : "EFG"}
dict1 + dict2
Traceback (most recent call last):
File "python", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
# 매직 메소드를 사용했을 때
class AddableDict(dict):
def __add__(self, otherObj):
self.update(otherObj)
return AddableDict(self)
dict1 = AddableDict({1 : "ABC"})
dict2 = AddableDict({2 : "EFG"})
print (dict1 + dict2) # {1: 'ABC', 2: 'EFG'}
매직 메소드의 종류는 굉장히 많다. 이에 대해서는 공식문서에 잘 정리가 되어있다.
공식 문서가 이해가 안 된다면 여기를 참고하면 된다.
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def __eq__(self, other): # 클래스끼리 == 기호를 쓸 때 호출
return (self.name == other.age) and (self.age == other.age)
def __ne__(self, other): # 클래스끼리 != 기호를 쓸 때 호출
return self.age != other.age
def __gt__(self, other): # 클래스끼리 > 기호를 쓸 때 호출
return self.age > other.age
def __str__(self): # 인스턴스에서 str()이 호출될 때 동작을 정의
return f'My Name Is {self.name}'
def __add__(self, other): # 클래스끼리 더할수 있음
return self.age + other.age
student_a = Student('펭수', 10)
student_b = Student('신짱구', 5)
# __add__ 매직 메소드
print(student_a+student_b) # 15
print(student_a.__add__(student_b)) # 15
# __str__ 매직 메소드
print(str(student_a)) # My Name Is 펭수
# __eq__, __ne__, __gt__ 매직 메소드
print(student_a==student_b) # False
print(student_a!=student_b) # True
print(student_a>student_b) # True