먼저 글에 들어가기 전에 패턴을 사용할 경우 생각해야 할 점은 다음과 같습니다.
1. 불필요한 패턴은 복잡성을 증가시킨다.
2. 패턴이 필요하다는 의미는 언어차원에서 지원하지 못하는 기능이 있다는 반증이다.
팩토리 패턴은 클래스와 함수를 매개 변수로 전달, 속성으로 저장할 수 없는 프로그래밍 언어를 위해 설계됩니다.
여기에서 말하는 속성을 저장할 수 없는 프로그래밍은 특정한 객체들은 변수로 사용하지 못하는 언어들을 가리킵니다. (이 급 객체)
그에 반대는 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킵니다. 보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 합니다.
일급 함수를 지원하는 파이썬에서는 팩토리 패턴이 좋지 않습니다. (어???)
팩토리 패턴은 DI(의존성 주입)을 통해 만들어지는데
1. 생성자
2. setter <- partial 로 생성
3. 인터페이스
Setter의 경우 생성자가 아니므로, 파라미터 개수를 더 낮출 수 있으며
일반 변수 할당과 같은 문법으로 사용하므로 더욱 파이선스럽다. (아래와 같이 변수처럼 할당하는 게 가장 좋음)
conn = HTTPConnection()
conn.response_class = SpecialHTTPResponse
partial를 사용할 경우 변수에 할당이 된 채로 의존성이 주입되게 됩니다. (아래는 예제입니다.)
from functools import partial
conn = HTTPConnection()
conn.response_class = partial(SpecialHTTPResponse, my_data, content_type='application/vnd.ms-excel')
partial를 사용하면 변수가 고정된다는 단점이 있지만, 해당 변수가 할당된 채 메모리에 올라가기 때문에 호출 시 할당하는 것보다 속도가 훨씬 빨라지게 됩니다.
번외
https://docs.python.org/3/library/functools.html
partial은 일반 함수에 대한 콜러블?(이라고 불러야 하나?)
partialmethod는 클래스 변수에 대한 콜러블.
번외 2
https://stackoverflow.com/questions/3252228/python-why-is-functools-partial-necessary
partial이 lambda보다 빠르지만
lambda는 외부 파라미터를 실시간으로 받고, partial는 한번 설정하면 변경 불가
참고사항
https://python-patterns.guide/gang-of-four/factory-method/
https://ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EC%84%B1_%EC%A3%BC%EC%9E%85
'app > python' 카테고리의 다른 글
파이썬 백엔드 면접 질문들 (장고+시스템+디비 포함) (0) | 2020.02.21 |
---|---|
python은 GIL때문에 스레드가 효율적이지 않으면서 왜 multithreading 모듈이 있을까? (0) | 2020.01.13 |
왜 python의 http 헤더 파서는 email 클래스에 있는가??!! (0) | 2020.01.05 |
[python] 서버를 만들어보자(1) echo-server (0) | 2019.12.10 |
[python] 서버의 기본 동작 방식 2 (0) | 2019.11.16 |