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