Python Magic Method

김신영·2024년 9월 16일

Python

목록 보기
1/10
post-thumbnail

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())          # str output
print(repr(A()))    # repr output

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)  # Vector(5)

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

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__)  # {'name': 'John'}
profile
Hello velog!

0개의 댓글