본문 바로가기

app/python

python의 팩토리 패턴과 partial

먼저 글에 들어가기 전에 패턴을 사용할 경우 생각해야 할 점은 다음과 같습니다. 

 

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