본문 바로가기
파이썬/파이썬 기초 문법

파이썬 스페셜 메서드

by 쵠몽 2024. 10. 19.

스페셜 메서드

스페셜 메서드(또는 매직 메서드라고도 불림)는 더블 언더스코어(__)로 시작하고 끝나는 메서드 이름을 가지며 특정 구문이나 내장 함수를 사용할 때 인터프리터에 의해 자동으로 호출된다.

 

 

1. __repr__()

  • 객체의 상태를 개발자가 쉽게 이해할 수 있도록 반환
  • 재생성할 수 있는 코드를 출력하도록 함
  • 객체의 주요 정보를 담고 있어야 함
class Cat:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __repr__(self):
        return f"Cat(name = '{self.name}', age = {self.age})"

Manbo = Cat('만보', 13)
print(repr(Manbo))		# Cat(name = '만보', age = 13)
Manbo		# Cat(name = '만보', age = 13)
print(Manbo)		# Cat(name = '만보', age = 13)

 

  • eval() : 파이썬 내장 함수로 문자열로 포현된 파이썬 코드를 실행하고 그 결과를 반환하는 기능
x = 10
y = 3
result = x + y
print(result)	# 13

result = eval("x + y")
print(result)	# 13
Manbo_repr = repr(Manbo)
new_Manbo = eval(Manbo_repr)  # Manbo 객체의 문자열을 새로운 객체로 만듦
print(new_Manbo)  # Cat(name = '만보', age = 13)
new_Manbo == Manbo  # False, 같은 값을 가진 다른 객체
new_Manbo,  # (Cat(name = '만보', age = 13),)

 

 

2. __str__()

  • 객체가 사람이 이해하기 쉽게 표현되도록 문자열로 변환하는 역할
  • __repr__()와 __str__()의 차이
    • __repr__(): 프로그래머에게 유용한 객체의 자세한 표현을 반환
    • __str__(): 사람이 읽기 쉽게 표현한 객체의 비공식적인 문자열을 반환
  • print()는 항상 __str__()를 우선 호출하고, __str__()가 없을 때 __repr__()가 호출됨
class Book:
    def __init__(self, title):
        self.title = title
book = Book('미친듯이 재밌는 파이썬')
print(book)
print(str(book))

 

class Book:
    def __init__(self, title):
        self.title = title
    def __str__(self):
        return self.title
book = Book('미친듯이 재밌는 파이썬')
print(book)
print(str(book))
li = [1, 2, 3, 4, 5]
print(li)
print(str(li))

 

 

3. __add__()

  • 연산자 오버로딩 메서드 '+' 연산이 정의되어 있음
  • '+' 연산자를 사용했을 경우 그 동작을 커스터마이즈하기 위해 사용
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __add__(self, other):
        return self.age + other.age
        
kim = Student('김사과', 20)
lee = Student('이메론', 30)
print(kim + lee)

 

 

4. __len__()

  • 객체의 길이(또는 크기)를 반환하는 메서드로 len() 함수가 호출될 때 자동으로 실행됨
class Queue:
    def __init__(self):
        self.items = [1, 2, 3, 4, 5]

    def __len__(self):
        return len(self.items)
        
li = [1, 2, 3, 4, 5]
print(li)
print(len(li))
queue = Queue()
print(queue)

queue = Queue()
print(queue)
print(len(queue))

 

 

5. __getitem__()

  • 객체를 리스트나 딕셔너리처럼 인덱싱할 수 있도록 해주는 메서드
  • __getitem__()을 오버라이드하면 사용자 정의 클래스의 인스턴스에서도 인덱스, 키, 슬라이싱 등을 사용해 요소에 접근할 수 있게 됨
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __getitem__(self, index):
        if index == 0:
            return self.x
        elif index == 1:
            return self.y
        else:
            return -1
            
pt = Point(5, 3)
print(pt)
print(pt[0])
print(pt[1])
print(pt[3])
class MyList:
    def __init__(self, data):
        self.data = data
    def __getitem__(self, index):
        return self.data[index]
        
ml = MyList([10, 20, 30, 40])
print(ml[0])
print(ml[1])
print(ml[-1])

 

 

6. __call__()

  • 클래스의 인스턴스를 함수처럼 호출할 수 있게 만들어주는 메서드
class CallableObject:
    def __call__(self, *args, **kwargs):
        print(f'args:{args}, kwargs:{kwargs}')
        
callable_obj = CallableObject()
callable_obj(1, 2, 3, a='A', b='B')

'파이썬 > 파이썬 기초 문법' 카테고리의 다른 글

파이썬 모듈  (2) 2024.10.20
파이썬의 예외 처리  (0) 2024.10.20
파이썬 상속  (2) 2024.10.19
클로저와 데코레이터  (1) 2024.10.14
객체지향과 클래스  (0) 2024.10.14