언어/Python

[Python] 파이썬의 매직 메소드 (Magic Method)

SeongOnion 2022. 1. 26. 22:13
728x90

매직 메소드 (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

 

3. 데이터 모델 — Python 3.7.12 문서

클래스는 특별한 이름의 메서드들을 정의함으로써 특별한 문법 (산술 연산이나 인덱싱이나 슬라이딩 같은)에 의해 시작되는 어떤 연산들을 구현할 수 있습니다. 이것이 연산자 오버 로딩 (operato

docs.python.org