- [Python] 파이썬 데코레이터2022년 12월 27일
- Cat_Code
- 작성자
- 2022.12.27.: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 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)