[Fluent Python] study week 5

Cha Hwa Young·2025년 2월 16일
0

Fluent Python Study

목록 보기
3/3

CH 5. 데이터 클래스 빌더

데이터 클래스 : 필드를 모아 놓은 간단한 클래스를 만드는 방법을 제공하는 패턴

  • collections.namedtuple
  • typing.NamedTuple
  • @dataclasses.dataclass
  • 코드 악취(code smell)

개요

  • namedtuple : 사용자가 지정한 이름과 필드를 가진 tuple의 서브클래스를 만드는 팩토리 함수
  • typing.NamedTuple:namedtuple`과 같은 기능을 제공 + 각 필드의 자료형을 지정
    import typing
    Coordinate = typing.NamedTuple('Coordinate', [('lat', 'float'), ('lon', 'float')])
    print(issubclass(Coordinate, tuple)) # True
    print(typing.get_type_hints(Coordinate)) # {'lat': <class 'float'>, 'lon': <class 'float'>}
    • 자료형과 항목명이 지정된 튜플 (typed named tuple) : 필드에 키워드 인수를 전달해 만들 수도 있음.
      Coordinate = typing.NamedTuple('Coordinate', lat=float, lon=float)

🤔 class문 안에서 NamedTuple이 슈퍼클래스처럼 보이지만 사실은 사용자 클래스를 생성하는 과정을 커스터마이즈하는 메타클래스의 고급 기능을 사용??

from typing import NamedTuple
class Coordinate(NamedTuple):
    lat: float
    lon: float

    def __str__(self):
        ns = 'N' if self.lat >= 0 else 'S'
        we = 'E' if self.lon >= 0 else 'W'
        return f'{abs(self.lat):.1f}°{ns}, {abs(self.lon):.1f}°{we}'
  • 슈퍼 클래스 : 다른 클래스가 상속받는 기본 클래스

    class Animal:
        def __init__(self, name):
            self.name = name
    
        def speak(self):
            pass
    
    class Dog(Animal):
        def speak(self):
            return f"{self.name}가 멍멍 짖습니다."
    
    class Cat(Animal):
        def speak(self):
            return f"{self.name}가 야옹 웁니다."

    위에선 Animal이 슈퍼 클래스, Dog과 Cat이 서브 클래스

고전적인 명명된 튜플

collections.namedtuple : 필드명, 클래스명 및 보기 좋게 출력해주는 __repr__()로 개선된 tuple 서브클래스를 만드는 팩토리

  • namedtuple로 만들어진 클래스는 튜플이 필요한 곳이면 어디든 사용 가능.

코드 악취

  • 빨리 감지할 수 있는 것으로 정의되는데, 긴 메서드가 그 사례
  • 늘 문제인 것은 아닌데, 그 자체로 문제라기보다는 문제가 있음을 가리키는 지표일 때가 많다.
profile
기회를 잡는 사람이 되도록!

0개의 댓글