본문 바로가기
Programming/Python

decorator - 데커레이터

by Chan_찬 2024. 10. 30.
728x90
반응형

python - decorator

decorator 패턴은 '@'표기를 사용해 함수 또는 메서드의 변환을 우아하게 지정해준다
'함수의 객체'와 '함수를 변경하는 다른 객체'의 wrapping을 허용한다

@deco
def method(arg):
  # method...
  pass

decorator 를 사용한 위 코드는 아래코드와 같다

def method(arg):
  # method...
  pass
method = deco(method)
import functools
import time

line_len = 80

def clen(s):
    """Calculate the effective length of a string considering full-width characters."""
    return sum(1 if ord(c) >= 0x2E80 else 0 for c in s)
    
def print_time_func(func):
  @functools.wraps(func)
  def wrapper(*args, **kargs):
    st = time.time()
    class_name = "클래스"
    if args and hasattr(args[0], "__class__"):
    	class_name = args[0].__class__.__name__
        
    s_str = f"{class_name}.{func.__name__} 시작"
    print(s_str.center(line_len-clen(s_str), "_"))
    res = func(*args, **kwargs)
    e_str = f"{class_name}.{func.__name__} 종료: {time.time()-st:.3f}"
    print(e_str.center(line_len-clen(e_str), "_"))
    return res
  return wrapper

@print_time_func
def method():
  # method...
  print('[method]')
  pass

>>> method()
-----------------------클래스.method 시작-----------------------
[method]
-------------------클래스.method 종료: 0.000--------------------
728x90
728x90
BIG
Buy me a coffeeBuy me a coffee

댓글