CS🏅/파이썬 🖤

[Python] 파이썬 데코레이터

Dobby98 2022. 12. 27. 16:50

데코레이터 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