기타 (Other)

[python] decorator 예제

Kim MyeongOk 2024. 12. 7. 22:37

파이썬에는 패키지로 나오는 라이브러리를 살펴보면 아래와 같이 쓰인 코드(@final, @property)가 흔히 보인다.

@final
class struct_time(structseq[Any | int], _TimeTuple):
    if sys.version_info >= (3, 10):
        __match_args__: Final = ("tm_year", "tm_mon", "tm_mday", "tm_hour", "tm_min", "tm_sec", "tm_wday", "tm_yday", "tm_isdst")

    @property
    def tm_year(self) -> int: ...
    @property
    def tm_mon(self) -> int: ...
    @property
    def tm_mday(self) -> int: ...
    ''' __________ (생략) __________ '''

 

@final, @property 가 뭔지 따라가보니 아래와 같은 메서드랑 클래스가 나왔다...

def final(f: _T) -> _T: ...
class property: ...

 

그리고 검색해보니 이게 "데코레이터"라는데, "@메서드"에 데코레이터 메서드를 작성하고, 내가 사용할 메서드 작성할때 위에 "@메서드"를 적어서 적용한다.

생명주기

데코레이터 메서드(매개변수에 사용할 메서드가 들어가서) 실행 > 내가 사용할 메서드 실행 > 내가 사용할 메서드 종료 > 데코레이터 메서드 종료

 

파이썬 코드 예제

from datetime import datetime, timedelta
from time import time, sleep
from logging import basicConfig as config
import logging

config(
    #filename='application.log', 
    level=logging.DEBUG, 
    format='%(asctime)s:%(levelname)s:%(message)s'
)

def print_start_end_time(func):
    def middle(*args, **kwargs):
        now = time()
        logging.info(f"{func.__name__}.sleep({kwargs['sleep_time']})")
        sleep(kwargs['sleep_time'])
        
        if func.__name__ in ['run']:
            result = func()
        else:
            result = func(*args, **kwargs)
            
        logging.info(f"========== [func: {func.__name__}] END work {time() - now:.4f} sec ==========")
        
        return result
    return middle

@print_start_end_time
def run():
    logging.info('run.process run')

run(sleep_time=0.5)

< 파이썬 코드 예제: 실행 결과 >

그 외

@property 를 통해 변수를 불러오고,

@변수명.setter 를 통해 변수 값 변경을 지정하여 변수 관리 가능

 

'기타 (Other)' 카테고리의 다른 글

아파치 카프카  (0) 2025.01.21
[python] pandas  (4) 2025.01.09
[python] logging  (0) 2024.12.07
[python] Flask 기본 통신 예제  (0) 2024.11.09
[python] MQTT 예제  (0) 2024.09.22