[Fluent Python] study week 1

Cha Hwa Young·2025년 1월 9일
0

Fluent Python Study

목록 보기
1/3

텍스트> 이 글은 PyLadies Seoul에서 진행하는 전문가를 위한 파이썬 (Fluent Python) 서적 같이 읽기 스터디 시리즈로, 서적을 학습하면서 알게 된 내용과 스터디 미팅하면서 나눈 이야기를 정리합니다.

Ch 1. 파이썬 데이터 모델

파이썬 데이터 모델

우선, 파이썬 데이터 모델이라는 단어가 다소 생소했다.

파이썬 데이터 모델 : 파이썬이 객체(Object)를 어떻게 다루는지 정의하는 프레임워크 또는 규칙

책에서 저자는 파이썬 데이터 모델을 제대로 이해해야 Pythonic 할 수 있다고 한다.
데이터 모델에 대한 자세한 설명은 파이썬 공식 문서를 읽어 보면 좋겠다. CPython 과 함께 이해할 만한 내용들이다.

특별 메서드

특별 메서드는 파이썬 데이터 모델을 구현하는 도구이다.
앞뒤에 이중 언더바가 붙은 __getitem__()__len__() 등이 있다.

random.choice() 처럼 표준 라이브러리에서 제공하는 것을 그대로 사용하면 메서드를 정의하지 않아도 되고, 슬라이싱, 정렬, 반복이 가능하다.

내 관점에서 이해도를 높이자면, Django 에서의 활용이 있을 듯 하다.

class Book(models.Model):
    title = models.CharField(max_length=100)
    pages = models.IntegerField()

    def __len__(self):
        return self.pages

위처럼 Django에 Book이라는 모델을 만들고,
__len__ 특별 메서드를 활용해서 book이라는 인스턴스의 페이지 수를 len(book)를 호출하여 확인할 수 있을 듯하다.

그리고 for문 역시 흔한 예시이다.

customers = Customer.objects.all()
for customer in customers:
	print(customer)

쿼리셋이 for문을 통해 순회하는 게 결국 __iter__ 특별 메서드 덕인 것!

특별 메서드의 활용

  • __abs__(), __add__()와 같은 특별 메서드를 벡터 클래스 연산에 사용한다.
  • 문자열 표현
    : __repr__()은 공식적인 문자열 표현 제공하고, __str__()은 비공식적인 표현 제공.
  • 불리언값 정의
    : bool(x) 연산은 x.__bool__()을 호출해 반환된 결과를 사용하는 것

len()을 메서드로 만들지 않은 이유

개인적으로 챕터 1에서 이 내용이 가장 흥미로웠는데,
결론적으로는 효율성과 일관성이 이유이다.

len()은 내장 함수이고, 메서드가 아니지만 __len__() 특별 메서드 덕분에 우리가 직접 정의한 객체에서 len()을 사용할 수 있는 것이다.

Ch 11. 파이썬다운 객체

객체 표현

앞서 챕터 1에서 설명한 대로 파이썬에서는 문자열을 표현하는 두 가지 방법이 있는데,
repr()str()이다.

  • repr() : 파이썬 콘솔이나 디버거에서 객체를 표현하는 모습
  • str() : 객체에 print()문을 적용할 때 나오는 모습

한편, 객체를 바이트 시퀀스로 표현하는 __bytes__() 메서드와 특정 형식으로 포매팅하는 __format__() 메서드가 있다.

@classmethod와 @staticmethod

두 가지 모두 데커레이터인데,

  • @classmethod : 인스턴스가 아닌 클래스에 연산을 수행하는 메서드
    메서드가 호출되는 방식을 변경해 인스턴스가 아닌 클래스 자체를 첫 번째 인수로 받는다.
class Pizza:
    default_topping = "cheese"  # 클래스 변수

    def __init__(self, topping):
        self.topping = topping

    @classmethod
    def make_default_pizza(cls):
        # 클래스 메서드: 기본 토핑으로 피자 생성
        return cls(cls.default_topping)

# example
pizza1 = Pizza("pepperoni")
print(pizza1.topping)  # pepperoni

pizza2 = Pizza.make_default_pizza()  # 클래스 메서드 호출
print(pizza2.topping)  # cheese
  • @staticmethod : 메서드가 특별한 첫 번째 인수를 받지 않게 메서드를 변경한다.
class Math:
    @staticmethod
    def add(x, y):
        # 정적 메서드: 두 수를 더함
        return x + y

# examplef
result = Math.add(3, 5)  # 정적 메서드 호출
print(result)  # 8

저자는 @staticmethod 데코레이터를 사용해야 하는 이유에 대해 테크니컬 리뷰어와 의견이 갈린다고 하였다.
리뷰어의 근거(?) 포스팅을 보아 하니, 가독성 향상과 바인딩된 객체를 생성하지 않아 메모리 사용량이 적어진다는 것이 이유일 것 같다.

__slots__로 메모리 절약

파이썬은 객체 속성을 각 객체 내의 __dict__라는 딕셔너리형 인스턴스 속성에 저장하는데, 메모리 사용량 부담이 크다.
이때, 속성들의 이름을 담은__slots__라는 클래스 속성을 정의하면 파이썬은 인스턴스 속성을 저장할 때 다른 저장소 모델을 사용한다.
🍯 숨은 배열이나 참조에 저장되므로 딕셔너리보다 메모리를 적게 사용하게 되는 것!

그러나, __dict____Slots__에 추가하지 않는 한 인스턴스는 __slots__에 나열된 속성만 가질 수 있고, __dict__를 추가해야만 &cached_property 데코레이터를 사용할 수 있다는 문제점이 있다.

클래스 속성 오버라이드

Django CBV(Class Based View)에서 자주 사용하는 방법으로, 클래스 속성은 공개되며 모든 서브클래스가 상속하므로, 클래스 데이터 속성을 customize할 때는 클래스를 상속한다.

from django.views.generic import ListView
from .models import Article

class BaseArticleListView(ListView):
    model = Article
    template_name = "article_list.html"
    context_object_name = "articles"

    def get_queryset(self):
        # 기본 쿼리셋: 모든 글을 반환
        return Article.objects.all()
        
class PublishedArticleListView(BaseArticleListView):
    def get_queryset(self):
        # 부모 클래스의 쿼리셋을 가져와 필터링
        queryset = super().get_queryset()
        return queryset.filter(published=True)

위처럼 queryset을 customize하기 위해서 BaseArticleListView라는 클래스를 상속 받아 재정의한 경우이다.

말로만 듣던 pythonic한 게 대체 어떤 것인지 알 수 있는 챕터였다.

스터디 미팅 후기

  • 스터디 챕터 1, 11이 특별 메서드라는 개념으로 이어지는 내용이라 다들 만족스러워하셨다.
    아무래도 전공책 두께의 서적을 마냥 순서대로 읽는 것보단 이게 집중도나 흥미 면에서 더 나은 듯 하다.
    (이 글을 보시는 다른 분들도 서적을 골라 스터디를 하신다면 try!)

  • 중국 속담인지 진위 여부는 모르겠지만😅, 챕터 11 말미에 나오는 다음 문장이 인상적이었다는 의견에 공감할 수 있었다.

    파이썬다운 객체를 만들려면, 실제 파이썬 객체가 어떻게 작동하는지 살펴보라.

  • 클래스 다이어그램이나 ABC와 같은 개념에 대한 이해가 잘 되지 않았는데, 각자가 어떻게 받아들였는지? 들을 수 있어 좋은 시간이었다.

  • 확실히 난이도가 있는 서적이다. 특히 주로 나오는 벡터 클래스 예제가 쉽지만은 않아서 다들 gpt의 도움을 많이 받았다는 이야기를 나눴다.
    ➡️ 1차는 gpt로, 2차는 스터디로, 그리고 3차 다시 복습?을 통해 온전히 내 것으로 가져갈 수 있음 좋겠다!

12주까지 완주 화이팅 🤗

profile
기회를 잡는 사람이 되도록!

0개의 댓글