Python is Free/Fluent Python

막힘없이 Python(파이썬) 하기 : 특별 메서드의 대표 예시

감각 수집가 2023. 4. 25. 00:07

특별메서드를 활용하는 경우는 크게 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로 사용할 수 있습니다.

 

리스트나 딕셔너리 같은 자료구조의 밑단에 있죠.

 

추상화 기본 클래스(출처 : Fluent Python)

 

반복문을 처리하는 Iterable, 길이를 구하는 Sized, 포함관계를 정하는 Container는

ABC로 구현하는 모든 자료가 가져야할 필수요소입니다.

 

for, len, in의 역할을 하죠.

 

자료구조 중

 

리스트와 문자열은 Sequence,

딕셔너리는 Mapping,

집합은 Set 을 사용합니다.

 

Sequence의 __reversed__는 순서를 정렬하는 리스트 등의 특성을 반영합니다.

 

드디어 예시가 끝났습니다.

 

특별메서드는 필요와 동작에 따라 정말 많고,

+= 가 __iadd__로 구현되는 등 확장 가능성도 풍부합니다.

 

파이썬 버전이 업데이트되면, 바뀌기도 하죠.

공부할꺼리가 참 많네요.

긴 글 읽어주셔서 감사합니다.