데코레이터 decorator
데이터 분석을 하다보면
특히, Pytorch를 활용하다 보면 @[메소드명]을 클래스나 메소드 위에 작성한 예시를 자주보게 될것이다.
이러한 것을 데코레이터 decorator방식이라고 하는데 왜 사용하는 것일까?
바로 메소드를 수정하지 않고 특정 동작을 이용할 수 있기 때문이다.
언제나 그렇듯 간단한 예시로 살펴보자
def Hi():
print('Hi !')
>>> Hi()
Hi !
Hi !를 출력해주는 간단한 메소드를 작성해 보았다
그런데 우리 서비스는 이용자가 들어올때마다
>>>이용자 이름
>>>Hi !
>>>선택한 서비스
순서로 출력하는 메소드를 구성하고 싶다
이미 우리에게 Hi !를 출력하는 메소드가 있기 때문에 이를 이용해서 새로운 메소드를 작성해 보자
def service(func):
def say():
print('홍길동')
func()
print('검색')
return say
새롭게 작성한 메소드 service는 메소드를 매개변수로 받고 있고
메소드 안에 새로운 say 메소드를 선언해서 매개변수로 받는 메소드를 불러오는 형태이다
이를 사용해보면 아래와 같다
>>> Hi = service(Hi)
>>> Hi()
홍길동
Hi!
검색
이를 데코레이터를 활용하면 간단하게 작성할 수 있다
@service
def good():
print("good !")
>>> good()
홍길동
good
검색
그러나 변수를 넘기면 어떻게 될까?
@service
def voice(msg):
print(msg)
>>> voice("How are you?")
Traceback (most recent call last):
File "<input>", line 1, in <module>
voice("How are you?")
TypeError: wrapper() takes 0 positional arguments but 1 was given
오류가 발생한다
이는 service의 say메소드의 원래 인자를 무시했기 때문이다
따라서 워래 함수에서 넘어오는 인자를 넘기기 위해서는 *args와 **kwargs를 활용해야한다
>>> def service(func):
def say(*args, **kwargs):
print("홍길동")
func(*args, **kwargs)
print("검색")
return say
service 메소드를 아래와 같이 수정해주고
@service
def voice(msg):
print(msg)
>>> voice("How are you?")
홍길동
How are you
검색
잘 작동하는 것을 확인할 수 있다
'CS🏅 > 파이썬 🖤' 카테고리의 다른 글
[CS]CPU bound vs. I/O bound (0) | 2023.06.08 |
---|---|
[Python] Typing 2편 (0) | 2023.05.31 |
[Python] Typing 1편 (0) | 2023.05.30 |
[Python] Iterator vs. Generator (0) | 2023.03.14 |
[Python] 간단한 class 정리 및 객체지향 프로그래밍 (1) | 2022.12.26 |