막힘없이 Python(파이썬) 하기 : 특별 메서드의 대표 예시
특별메서드를 활용하는 경우는 크게 4가지 정도로 볼 수 있습니다.
수치형 자료 흉내내기, 객체들의 문자열 표현, 객체의 논리형 값, collections 적용.
하나씩 살펴보죠.
수치형 자료 흉내내기
물리학과 수학에서 수치는 중요합니다.
수치 데이터를 흉내 내는 도구는 수학기반 모형을 다룰 때 매우 유용하겠네요.
벡터의 연산은 아래처럼 정의할 수 있습니다.
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Vector(x, y)
__add__ 특별 메서드를 정의해 2차원 벡터의 덧셈을 모방하는 코드를 작성했습니다.
객체들의 문자열 표현
__repr__과 __str__ 메서드는 문자열 표현을 다루는 특별 메서드입니다.
__repr__은 기본적으로 디버깅에서 사용합니다.
개발자가 구현시 따로 __str__을 정의하지 않으면,
print()나 str()등 문자열 기반 작업 시 파이썬 인터프리터는 __repr__부터 사용합니다.
이름과 나이를 담는 클래스가 동작하는 과정을 살펴보면, 둘의 차이점이 더 잘 드러납니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name}, {self.age} years old"
person = Person("지식맛집", 31)
print(person) # 결과 : 지식맛집, 31 years old
이건 익숙하죠? 편리성에 초점을 뒀다고 합니다.
__repr__의 예를 보죠.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person('{self.name}', {self.age})"
person = Person("지식맛집", 31)
print(repr(person)) # 결과: Person('지식맛집', 31)
__repr__가 더 명시적이고, 구체적이죠.
__repr__도 정의하지 않는다면, 아래 결과를 내뱉을 겁니다.
<Person object at memory_address>
객체의 논리형 값
__bool__로 or과 같은 경우에 대응하거나, false여부를 잡아낼 수 있습니다.
Collections 적용
추상화 기본 클래스(abstract base classes)는 줄여서 ABC라고 부르고,
collections.abc로 사용할 수 있습니다.
리스트나 딕셔너리 같은 자료구조의 밑단에 있죠.
반복문을 처리하는 Iterable, 길이를 구하는 Sized, 포함관계를 정하는 Container는
ABC로 구현하는 모든 자료가 가져야할 필수요소입니다.
for, len, in의 역할을 하죠.
자료구조 중
리스트와 문자열은 Sequence,
딕셔너리는 Mapping,
집합은 Set 을 사용합니다.
Sequence의 __reversed__는 순서를 정렬하는 리스트 등의 특성을 반영합니다.
드디어 예시가 끝났습니다.
특별메서드는 필요와 동작에 따라 정말 많고,
+= 가 __iadd__로 구현되는 등 확장 가능성도 풍부합니다.
파이썬 버전이 업데이트되면, 바뀌기도 하죠.
공부할꺼리가 참 많네요.
긴 글 읽어주셔서 감사합니다.