포도가게의 개발일지

파이썬 (9) 본문

Tech

파이썬 (9)

grape.store 2025. 7. 15. 21:28
반응형

일급함수 디자인 패턴

  • 파이썬을 이용하여 GoF(Gang of Four)의 고전 디자인 패턴을 Python의 일급 함수(first-class functions) 특성을 활용해 더 간단하고 Pythonic하게 재해석하는 내용 → 코드 간결, 유연.
  • Python의 일급 함수(first-class functions)를 활용해 더 간단하게 strategy patter을 구사할 수 있다.
  • 클래스 계층(Promotion 추상 클래스 + 구체 클래스들)을 없애고, 단순한 함수로 할인 로직을 정의해. 이 접근은 코드가 더 짧아지고, 동적으로 프로모션을 추가/제거하기 쉽다는 장점이 있어.
  • 클래스 vs. 함수: 클래스는 상태/상속 필요 시 좋지만, 단순 로직엔 함수가 가볍다.

메타전략과 모듈 자동 로드

  • 확장성: 프로모션 100개? 리스트 수정 없이 모듈에 함수 추가만.
  • 주의: 할인 중복 피하려면 함수 설계 주의
import inspect

# ... (프로모션 함수들)

promos = [func for _, func in inspect.getmembers(promotions, inspect.isfunction)]  # promotions 모듈에서 함수만

# 또는 현재 모듈(__name__ == '__main__')에서:
promos = [func for _, func in inspect.getmembers(sys.modules[__name__], inspect.isfunction)
          if _.endswith('_promo') and _ != 'best_promo']

데코레이터을 이용한 전략

  • 여기서는 데커레이터(@promotion)를 활용해 프로모션 함수를 더 우아하게 등록하는 방법을 다뤄
  • @promotion: 함수 정의 시 호출됨 (모듈 로드 때). promos가 자동 채워짐.
  • 함수에 @promotion 붙여 "이게 프로모션임" 표시. globals()처럼 이름 의존 안 함.
  • 주의: 데커레이터는 로드 시 실행되니, 동적 로드 필요 시 inspect와 결합.

파이썬다운 객체

  • 특수 메서드(special methods, 던더 메서드)를 구현하여 객체의 표현, 연산, 동작을 Pythonic하게 만드는 것
__repr__(): 개발자용 디버깅 표현 (예: Vector2d(3, 4) → 'Vector2d(3.0, 4.0)'). 객체를 재생성할 수 있는 문자열을 반환해야 합니다.
__str__(): 사용자용 문자열 표현 (예: print(obj) 시 호출). 기본적으로 __repr__()를 fallback으로 사용.
__bytes__(): 바이트 표현 (바이너리 데이터로 변환).
__format__(): 포맷 지정자 지원 (예: {obj: .2f}).

__iter__(): 반복 가능하게 만듦 (예: x, y = v).
__abs__(): 벡터 크기 (유클리드 거리: math.hypot(x, y)).
__bool__(): 벡터가 (0,0)이 아니면 True.
__eq__(): 다른 객체와 비교 (튜플로 변환 후 비교).

class Vector2d:
    typecode = 'd'  # double precision float

    def __init__(self, x, y):
        self.x = float(x)
        self.y = float(y)

    def __iter__(self):
        return (i for i in (self.x, self.y))  # 제너레이터

    def __repr__(self):
        class_name = type(self).__name__
        return '{}({!r}, {!r})'.format(class_name, *self)

    def __str__(self):
        return str(tuple(self))

    def __bytes__(self):
        return (bytes([ord(self.typecode)])) + bytes(array(self.typecode, self))

    def __eq__(self, other):
        return tuple(self) == tuple(other)

    def __abs__(self):
        return math.hypot(self.x, self.y)

    def __bool__(self):
        return bool(abs(self))

객체 표현

  • repr vs str:
    • repr(): 정확성 중심 (디버깅용).
    • str(): 가독성 중심 (사용자 출력용).

클래스 메서드

  • 클래스 메서드는 인스턴스가 아닌 클래스 자체를 첫 번째 인수로 받는 메서드입니다. 데코레이터 @classmethod를 사용해 정의하며, 주로 팩토리 메서드(대체 생성자)로 활용됩니다.

해시 가능한

  • 객체를 해시 가능(unhashable → hashable)하게 만들어 set, dict의 키로 사용할 수 있게 합니다.
  • 이를 위해 hash()와 eq()를 구현해야 하며, 객체가 불변(immutable)이어야 합니다.

파이썬에서의 비공개 속성과 보호된 속성

  • 파이썬에는 진정한 private 속성이 없지만, 이름 맹글링(name mangling)을 통해 "비공개"처럼 보호합니다. 이는 속성 이름 앞에 이중 언더스코어()를 붙여 자동으로 _클래스명속성명으로 변환하는 메커니즘입니다.
  • _로 시작 (단일 언더스코어). 관례상 "보호됨" 표시지만, 접근 가능. "내부 사용" 의미.

'Tech' 카테고리의 다른 글

파이썬 (11)  (0) 2025.07.19
파이썬 (10)  (0) 2025.07.18
파이썬 (8)  (1) 2025.07.14
Python (6)  (3) 2025.07.09
python (5)  (0) 2025.07.01
Comments