Python의 Magic Method 또는 Special Method 는 __init__, __str__, __len__처럼 이중 밑줄로 시작하고 끝나는 메서드들입니다.
이들은 Python의 내부 동작을 제어하며, 커스텀 클래스를 Python 내장 기능처럼 동작하도록 만듭니다.
1. 생성 및 초기화 관련
| 메서드 | 설명 | 예시 |
|---|
__new__ | 인스턴스 생성 전 호출되는 메서드 | 클래스 객체 생성 시 |
__init__ | 인스턴스 초기화 메서드 | 생성자 역할 |
__del__ | 객체가 삭제될 때 호출되는 소멸자 | 자원 해제 등 수행 |
class A:
def __init__(self, value):
self.value = value
def __del__(self):
print("Deleted")
a = A(10)
2. 문자열 표현 관련
| 메서드 | 설명 |
|---|
__str__ | print()나 str() 호출 시 문자열 반환 |
__repr__ | repr()이나 디버깅 시 객체 표현 반환 |
class A:
def __str__(self):
return "str output"
def __repr__(self):
return "repr output"
print(A())
print(repr(A()))
3. 수학 연산 관련
| 메서드 | 설명 |
|---|
__add__ | + 연산자 정의 |
__sub__ | - 연산자 정의 |
__mul__, __truediv__, __mod__ | 곱셈, 나눗셈, 나머지 연산자 정의 |
__pow__ | 제곱 연산자 정의 |
__neg__ | 음수 연산자 (-a) |
__abs__ | abs() 호출 시 |
class Vector:
def __init__(self, x):
self.x = x
def __add__(self, other):
return Vector(self.x + other.x)
def __str__(self):
return f"Vector({self.x})"
v1 = Vector(2)
v2 = Vector(3)
print(v1 + v2)
4. 비교 연산자
| 메서드 | 설명 |
|---|
__eq__, __ne__ | ==, != 비교 |
__lt__, __le__, __gt__, __ge__ | <, <=, >, >= 비교 |
class Person:
def __init__(self, age):
self.age = age
def __lt__(self, other):
return self.age < other.age
5. 컨테이너 및 반복
| 메서드 | 설명 |
|---|
__len__ | len(obj) 호출 시 |
__getitem__ | obj[i] 인덱싱 시 |
__setitem__, __delitem__ | 항목 설정 및 삭제 |
__iter__, __next__ | 반복자 구현 (for 루프) |
class MyList:
def __init__(self, data):
self.data = data
def __getitem__(self, idx):
return self.data[idx]
def __len__(self):
return len(self.data)
6. 호출 및 속성 제어
| 메서드 | 설명 |
|---|
__call__ | obj()처럼 호출 가능하게 함 |
__getattr__, __setattr__ | 속성 접근 및 설정 제어 |
__getattribute__ | 모든 속성 접근 감시 |
__dir__ | dir() 출력 커스터마이징 |
class Adder:
def __call__(self, a, b):
return a + b
add = Adder()
print(add(3, 4))
7. 컨텍스트 매니저 (with 문)
| 메서드 | 설명 |
|---|
__enter__, __exit__ | with 블록 진입/탈출 시 호출 |
class MyContext:
def __enter__(self):
print("Entering")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Exiting")
with MyContext():
print("Inside block")
8. 기타 중요 특수 속성
__slots__
- 인스턴스가 가질 수 있는 속성을 제한하여 메모리 사용을 줄임
__dict__를 생성하지 않아 속성 동적 추가가 불가능함
class Point:
__slots__ = ['x', 'y']
def __init__(self, x, y):
self.x = x
self.y = y
__dict__
- 인스턴스의 모든 속성을 딕셔너리로 저장
__slots__을 쓰지 않는 일반 클래스에서 자동 생성됨
class Person:
def __init__(self, name):
self.name = name
p = Person("John")
print(p.__dict__)