본문 바로가기
프로그래밍 언어/Python

Fluent Python - The Python Data Model

by 데브조이 2025. 5. 28.
반응형
이 글은 Fluent Python을 공부하며 작성한 글입니다. 
책 정보: https://product.kyobobook.co.kr/detail/S000003305134

 

개요

회사에서 Python, FastAPI를 이용하여 백엔드 서버를 구성하고 있다. Python을 아이펠에서 AI 공부할 때 배운 후 알고리즘 공부 등에 꾸준히 사용해 왔지만 깊은 지식은 없었다. 말 그대로 Python를 사용할 수 있지만, 자세히 설명하지는 못하는 상태였다. 언어의 사용 목적이 달라진 만큼 깊은 지식의 필요성을 느껴 Fluent Python을 읽기로 했다. 


파이썬 데이터 모델 - Python Data Model

파이썬의 장점은 일관성이다. 익숙하지 않은 기능에 대해 추론과 예상이 가능하다.
우리는 Pythonic 방식을 습득하려면 파이썬의 데이터 모델을 제대로 이해할 필요가 있다.

Data Model은 sequences, functions, iterators, coroutines, classes, context managers 등 인터페이스를 공식화한 프레임워크같은 개념이다. 

파이썬 인터프리터는 특정 상황에 트리거되는 작업을 수행하기 위해 스페셜 메서드(special method)를 호출한다.

 


스페셜 메서드 - Special Method

스페셜 메서드를 구현하여 사용자 정의 객체가 내장 타입처럼 동작하게 할 수 있다.
→ 파이썬스러운 코드를 작성할 수 있다.
  • 메서드명 앞뒤로 __(2개의 언더스코어)가 붙는다.
  • 매직 메서드(magic method) 라고도 한다. 
  • double underscore의 줄임말인 dunder를 사용하여 던더 메서드(dunder methods) 라고도 한다.

 

스페셜 메소드를 구현하는 경우는 아래와 같다.

  • 컬렉션 (Collections)
  • 속성 접근 (Attribute access)
  • 이터레이션 (Iteration) - 비동기 이터레이션 포함
  • 연산자 오버로딩 (Operator overloading)
  • 함수 및 메서드 호출 (Function and method invocation)
  • 문자열 표현 및 포맷팅 (String representation and formatting)
  • await를 사용한 비동기 프로그래밍 (Asynchronous programing)
  • 객체 생성 및 소멸 (Object creation and destruction)
  • with 또는 async with 문을 사용한 관리 컨텍스트 (Managed contexts)

 

스페셜 메서드를 사용하여 파이썬 데이터 모델을 활용하는 것의 두 가지 장점

1. 사용자가 표준 연산을 위해 임의의 메서드 이름을 외울 필요가 없다. → 표준 파이썬 타입처럼 동작하게 만든다.
2. 풍부한 파이썬 표준 라이브러리를 사용할 수 있고, 바퀴의 재발명을 피하기 쉽다.   기존 언어 기능 및 표준 라이브러리와 통합되게 한다 (만들어진 기능을 활용).


스페셜 메서드는 어떻게 사용되는가 - How Special Methods Are Used

The first thing to know about special methods is that they are meant to be called by the Python interpreter, and not by you.
스페셜 메서드는 개발자가 직접 호출하는 것이 아니라 파이썬 인터프리터에 의해 호출되도록 만들어졌다.

 

사용자 정의 클래스와 내장 타입(built-in types) 차이

사용자가 정의한 클래스의 인스턴스에 대해 len() 함수를 호출하면 인터프리터가 내부적으로 __len__ 을 호출한다.
반면 list, str, bytearray와 같은 내장 타입이나 NumPy 배열에서는 __len__을 호출하지 않고 다른 방식을 사용한다.

내장 타입은 C언어로 구현되어있기 때문이다. 
이는 PyVarObject 라는 C 구조체를 포함하고 있으며, 그 안에는 객체의 항목 수를 직접 저장하는 ob_size라는 필드가 있다. 
그렇기 때문에 굳이 __len__을 호출하지 않고, ob_size 값을 직접 읽어오는 방법을 사용한다. 

이 부분에서 아래와 같은 파이썬의 디자인 철학을 느낄 수 있다.

실용성이 순수성보다 우선한다(practicality beats purity).

 


스페셜 메서드 핵심 용도 - The most important uses of special methods

Emulating numeric types
String representation of objects
Boolean value of an object
Implementing collections

 

1. Emulating numeric types(숫자 타입 에뮬레이션)

import math 

class Vector:

    def __init__(self, x=0, y=0): 
    	self.x = x
        self.y = y
    
    def __repr__(self):
    	return f'Vector({self.x!r}, {self.y!r})'
    
    def __abs__(self):
    	return math.hypot(self.x, self.y)
	
    def __bool__(self): 
        return bool(abs(self))
	
    def __add__(self, other): 
    	x = self.x + other.x
        y = self.y + other.y 
        return Vector(x, y)

	def __mul__(self, scalar):
		return Vector(self.x * scalar, self.y * scalar)

 

2. String representation of objects(객체의 문자열 표현)

  • __repr__ 스페셜 메서드는 객체를 검사하기 위한 문자열 표현을 얻기 위해 repr 내장 함수에 의해 호출된다.
  • __repr__가 반환하는 문자열은 모호하지 않아야 하며, 가능하면 표현된 객체를 다시 생성하는 데 필요한 소스 코드와 일치해야 한다.
  • __str__str() 내장 함수에 의해 호출되며 print 함수에 의해 암시적으로 사용된다.
    최종 사용자에게 표시하기에 적합한 문자열을 반환해야 한다.

 

3. Boolean value of an object(객체의 불리언 값)

x가 참인지 거짓인지 판단하기 위해 파이썬은 bool(x)를 적용한다.
사용자 정의 클래스의 인스턴스는 __bool__ 또는 __len__
이 구현되지 않으면 참으로 간주한다.

 

4. Collection API

각 최상위 ABC(기본 추상 클래스)는 단일 스페셜 메서드를 가진다.
Collection ABC 는 모든 컬렉션이 구현해야 할 3개의 필수 인터페이스를 통합한다. 

  • Iterable: for, 언패킹 및 기타 형태의 이터레이션 지원
  • Sized: len 내장 함수 지원
  • Contains: in 연산자 지원

 

Collection의 중요한 특수화

  • Sequence: list 및 str과 같은 내장 타입의 인터페이스를 형식화
    • Reversible 한 특징
  • Mapping: dict, collections.defaultdict 등에 의해 구현
    • 파이썬 3.7 부터 dict 타입은 순서가 있는 것으로 간주되지만, 키 삽입 순서가 보장됨을 의미 (재정렬 불가)
  • Set: set 및 frozenset 내장 타입의 인터페이스
반응형