반응형
Closure의 사전적 의미를 먼저 보면 폐쇄이다.
하지만 이렇게 보는것은 조금 이해에 도움이 되지 않을 것 같아서 비유를 해서 설명해보겠다.
우선 객체지향 프로그래밍에서 중요한 것중에 encapsulation이 있다. 이것과 비슷하게
함수를 캡슐화하는 것이나 함수를 찍어내는 공장이라고 이해하면 좋을 것 같다.
예제 코드를 보겠다.
def add(var):
return var + 2
def multiply(var):
return var * 2
def factory(function, n): # 함수를 파라미터로 받는 Factory
def closure(var): # Closure 생성
for _ in range(n):
var = function(var)
return var
return closure
print(factory(add, 4)(10))
print(factory(multiply, 4)(3))
이런식으로 사용할 수 있다.
이를 응용한 decorator가 있다.
이 부분도 코드를 통해 이해해 보자.
def print_closure_factory(function):
def print_closure(var):
print("Input:", var)
out = function(var)
print("Output:", out)
return print_closure
def add(var):
return var + 2
print_add = print_closure_factory(add)
print_add(10)
위 코드를 decorator를 사용해서 아래와 같이 더 보기 쉽고 짧게 만들 수 있다.
def print_decorator(function):
def print_closure(var):
print("Input:", var)
out = function(var)
print("Output:", out)
return print_closure
@print_decorator
def add(var):
return var + 2
add(10)
decorator를 한국어로 꾸밈자라고 하는데 특징은 다음과 같다.
- 함수 하나를 인자로 받아 같은 형태의 함수를 반환하는 함수
- @을 사용하여 함수를 꾸미는데 사용 가능
- Class를 사용할 시 Decorator에 인자 추가가 가능
여기서 인자를 추가하려면 아래와 같이 한 번 더 wrapping 하면 된다
def times_decorator_factory(times): # 인자를 받아 Decorator를 만들기
def times_decorator(function): # 함수를 받아 꾸미기
def closure(var): # 꾸며진 함수
for _ in range(times):
var = function(var)
return var
return closure
return times_decorator
@times_decorator_factory(5) # Decorator에 인자 추가
def add(number):
return number + 2
print(add(5))
여기까지 closure의 설명과 예제를 보았다.
아직 익숙하지 않아 많이 사용은 안하지만
주변의 파이썬 개발자들은 생각보다 많이 사용한다고 한다.
익숙해지도록 많이 사용을 해봐야겠다.
반응형
'Studying > Python' 카테고리의 다른 글
[Python] 웹 크롤링 데이터 클래스를 사용해 구조화해서 접근하기 (0) | 2022.06.06 |
---|---|
[Python] 웹 크롤링 해보기( 네이버 영화리뷰 크롤링) (0) | 2022.06.06 |
[Python] 내장함수 sorted 구현 (0) | 2022.05.24 |
[Python] 내장함수 sum 구현 (0) | 2022.05.19 |
[Python] 내장함수 map 구현 (0) | 2022.05.19 |
댓글