• 티스토리 홈
  • 프로필사진
    Cat_Code
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
Cat_Code
  • 프로필사진
    Cat_Code
    • 분류 전체보기 (117)
      • [네이버 부스트캠프] (46)
        • ⭐주간 학습 정리 (43)
        • 🎶추가 학습 정리 (3)
      • [연습의 흔적들] (27)
        • 백준⚾ (26)
        • 캐글 & 데이콘 🤝 (1)
      • [ML] (23)
        • 머신러닝 💕 (5)
        • 딥러닝 🔫 (10)
        • 데이터 분석 🖤 (1)
        • 수학 ☑️ (4)
        • LLM🦜 (3)
      • [CS] (17)
        • 파이썬 🖤 (13)
        • 해체 분석기📝 (3)
        • Service Product (1)
        • MultiMedia (0)
      • [개발일지] (2)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [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일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바