규도자 개발 블로그
closure로 class 만들어보기 (feat python) 본문
closure로 class 만들어보기 (feat python)
예전에 이런 글을 썼었다.
클로저(closure)란 무엇인가 (clojure 아님. Feat. Python)
이 글을 쓰면서 그런 생각이 들었다. 꼭 class와 object같다.
그래서 한번 만들어봤다.
def closure_class(data=None):
if data is None:
data = {
'name': ''
}
def closure():
def set_name(name):
data['name'] = name
return data['name']
def get_name():
return data['name']
closure_set = lambda: ...
closure_set.set_name = set_name
closure_set.get_name = get_name
closure_set.print_name = lambda: print(data['name'])
return closure_set
closure.attr = closure()
return closure
이런 모습이 된다. 원래는 closure_set으로 반환하는 곳을 dict로 구성했었는데 그러면 뭔가 class같은 느낌이 안들어서(억지) 함수에 attribute형태로 추가해서 리턴하는 형태로 구성하였다.
아래처럼
def closure_class(data=None):
if data is None:
data = {
'name': ''
}
def closure():
def set_name(name):
data['name'] = name
return data['name']
def get_name():
return data['name']
closure_set = lambda: ...
closure_set.set_name = set_name
closure_set.get_name = get_name
closure_set.print_name = lambda: print(data['name'])
return closure_set
closure.attr = closure()
return closure
test1 = closure_class({'name': 'damon'})
test2 = closure_class({'name': 'jujumilk3'})
test3 = closure_class({'name': 'gyudoza'})
print(test1.attr.get_name())
print(test1.attr.set_name('damon_changed'))
print(test1.attr.get_name())
test1.attr.print_name()
print(test2.attr.get_name())
test3.attr.print_name()
============================================================
damon
damon_changed
damon_changed
damon_changed
jujumilk3
gyudoza
사용할 수 있다. 근데 그냥 class를 쓰는 게 좋다.
return type이 attribute나 method가 아니고 clsoure에 붙어있는 attr도 그냥 함수 자체 때려박은 멤버변수이기 때문에 IDE에서 인식하지 못한다. 그냥 예전에 closure관련 글을 쓰면서 어 이렇게 쓸 수도 있겠는데? 하는 마음에 진행해봤다.
'FP > Concept' 카테고리의 다른 글
함수형 프로그래밍을 하면서 느낀 것들 (3) | 2022.06.13 |
---|---|
클로저(closure)란 무엇인가 (clojure 아님. Feat. Python) (0) | 2022.06.12 |
Comments