매직 메소드 (Magic Method)란?
매직 메소드 혹은 스페셜 메소드라고 불리며, 메소드의 양쪽을 두 개의 언더스코어(__)로 감싼 메소드를 말한다.
일반적으로 파이썬의 클래스 내에 내부적으로 구현되어 있다.
매직 메소드를 적절히 사용하면 클래스를 보다 폭넓게 사용할 수 있고, 사용자가 직접 만든 클래스를 마치 파이썬의 내장 클래스처럼 사용할 수 있다.
아마 파이썬을 사용하며 가장 처음 접하거나 구현하는 매직 메소드는 __init__() 혹은 __str__() 일 것이다.
__init__()
해당 메소드는 파이썬 클래스의 인스턴스를 생성할 때 자동으로 호출되며, 일반적으로 인스턴스 생성과 함께 인스턴스 변수를 선언하기 위해 사용된다.
class Person:
def __init__(self):
print("인스턴스 생성")
p1 = Person()
# 인스턴스 생성
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("SeongEon", 27)
print(p1.name) # SeongEon
print(p1.age) # 27
__str__()
해당 메소드는 객체를 우리가 이해할 수 있는 문자열로 만들 수 있도록 해준다.
# __str__ 오버라이딩 전
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("SeongEon", 27)
print(p1) # <__main__.Person object at 0x7f78a0036df0>
보다시피, 클래스의 __str__() 메소드를 정의해주지 않으면, 정확히 말해 오버라이딩 해주지 않으면 해당 객체의 메모리상 위치를 리턴해준다.
# __str__ 오버라이딩 후
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person {self.name}"
p1 = Person("SeongEon", 27)
print(p1) # Person SeongEon
이 메소드는 아마 모두들 이미 잘 알고 있는 print()함수와 밀접하게 연관되어 있다.
print()함수는 인자로 받은 객체에 정의된 __str__() 메소드가 반환하는 문자열을 출력해준다.
우리가 너무 당연하게 사용하고 있던 리스트, 문자, 숫자, 딕셔너리 등등.. 모두 __str__() 메소드를 통해 print()로 출력할 값을 정의해놓고 있다.
class A():
def __str__(self):
return "__str__ 메소드 호출!"
a = A()
print(a) # __str__ 메소드 호출!
__len__()
두 가지 이외에도, 특정 객체의 길이를 구하는 len() 또한 매직 메소드로, 새로 만드는 객체에 대하여 오버라이딩이 가능하다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person {self.name}"
def __len__(self):
return self.age
p1 = Person("SeongEon", 27)
print(len(p1)) # 27
그 밖에도, 기본적인 연산(+, -, *, /)이나 논리연산자( >, <, ==), 특정 객체가 iterator에 존재하는지 확인하는 in 등 많은 기능을 사용자가 오버라이딩 해 직접 정의할 수 있도록 해주는 많은 매직 메소드가 있다.
- __add__: 더하기 연산
- __mul__: 곱하기 연산
- __doc__: 객체의 DocString을 리턴하는 연산자
- __gt__: ~보다 크다 (greater than)
- __ge__: ~보다 크거나 같다 (greater than or equal to)
- __lt__: ~보다 작다 (less than)
- __le__: ~보다 작거나 같다 (less than or equal to)
- __del__: 객체가 삭제될 때 호출되는 메소드
- __eq__: == 연산 (equals)
- __ne__: != 연산 (not equals)
더보기: https://docs.python.org/ko/3.7/reference/datamodel.html#special-method-names
'언어 > Python' 카테고리의 다른 글
[Python] 아스키코드 사용하기 (0) | 2022.01.19 |
---|---|
[Python] 파이썬의 GIL (Global Interpreter Lock) (2) | 2021.10.22 |
[Python] heapq(우선순위 큐) 사용법 (0) | 2021.09.19 |
[Python] 집합 자료형 다루기 (0) | 2021.08.04 |
[Python] collections 모듈의 Counter 함수 (2) | 2021.04.04 |