포도가게의 개발일지
파이썬 (9) 본문
반응형
일급함수 디자인 패턴
- 파이썬을 이용하여 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