[python] ๐ŸŽ€ Decorator : @ ์˜ ๋ฏธํ•™

๊ฐ•์ฝฉ์ฝฉยท2022๋…„ 4์›” 13์ผ
0

python_dev

๋ชฉ๋ก ๋ณด๊ธฐ
2/2
post-thumbnail

โœจ ์•ˆ๋…•ํ•˜์„ธ์š”, ์˜ค๋Š˜์€ Decorator ์‚ฌ์šฉ๋ฒ•์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

Decorator? Callable?

๐Ÿ˜‹ ๋ง ๊ทธ๋Œ€๋กœ '๊พธ๋ฉฐ์ฃผ๋Š”' ๊ธฐ๋Šฅ์„ ํ•˜๋Š” python callable์ž…๋‹ˆ๋‹ค :)
๐Ÿคทโ€โ™‚๏ธ ์—ฅ? ๊ทผ๋ฐ callable์€ ๋˜ ๋ญ์•ผ?

callable์€ ๋ง ๊ทธ๋Œ€๋กœ 'call ํ•  ์ˆ˜ ์žˆ๋Š”' python ๊ฐ์ฒด๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ , 'call'์ด๋ž€ : "()"์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. :)
๐Ÿ˜Š ํ•จ์ˆ˜, ํ˜น์€ class๊ฐ€ ์—ฌ๊ธฐ์— ์†ํ•˜์ฃ !

๐Ÿ˜ƒ ํ•จ์ˆ˜๊ฐ™์€ ๊ฒฝ์šฐ๋Š”, ํ•จ์ˆ˜ ์ •์˜์™€ ๋™์‹œ์— ๊ฐ„๋‹จํ•˜๊ฒŒ call ํ•  ์ˆ˜ ์žˆ์ฃ .

def func_call():
	print('call!')

# "()"์„ ์‚ฌ์šฉํ•ด call ํ•˜์˜€์Šต๋‹ˆ๋‹ค!
func_call()
>>> call!

๐Ÿ˜Ž ๋ฐ˜๋ฉด์—, class๋Š” __call__() ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์ฃผ๋ฉด call ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class ClassCall(object):
	def __init__(self):
    	pass
   	def __call__(self):
    	print('call class!')
        
instance_call = ClassCall()
instance_call()
>>> call class!

๐Ÿ˜‰ OK! callable์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•˜์œผ๋‹ˆ, Decorator๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ง€์š” :)

Decorator : ๊พธ๋ฏผ๋‹ค!

๐Ÿ˜Ž Decorator๋Š” '๊พธ๋ฉฐ์ฃผ๋Š” ์ž'๋ผ๋Š” ์˜๋ฏธ ๊ทธ๋Œ€๋กœ, callable(ํ•จ์ˆ˜ or class)๊ฐ€ call๋  ๋•Œ ์•ž๋’ค๋กœ ๊พธ๋ฉฐ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋”ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ˜ ์ฃผ๋กœ ๋ฐ˜๋ณตํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ(์‹œ๊ฐ„ ์ฒดํฌ)๋“ค์„ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค!
๐Ÿ˜‹ ๋ฐฑ๋ฌธ์ด ๋ถˆ์—ฌ์ผ๊ฒฌ! ํ•œ๋ฒˆ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด์‹œ์ฃ  :)

import time

# ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜
def time_check(func):                            
    def deco_wrapper():                           
        print(func.__name__, 'function start')
        st = time.time()
        func()
        et = time.time()
        print("Function Spent TIME : {}".format(et-st))
        print(func.__name__, 'function end')
    return deco_wrapper   
    
@time_check
def print_yaho():
	print('yaho!')
    
print_yaho()
>>> print_yaho function start
    yaho!
    Function Spent TIME : 4.291534423828125e-06
    print_yaho function end

def print_yaho():
	print('yaho!')
    
print_yaho()
>>> yaho!

๐Ÿ˜‰ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด, ํ•จ์ˆ˜ ์„ ์–ธ์‹œ "@"๋กœ ๊พธ๋ฉฐ์ฃผ๋ฉด
โœŒ deco_wrapper์•ˆ์˜ ๋กœ์ง์ด ์•ž๋’ค๋กœ ์ˆ˜ํ–‰๋œ ํ›„ func, ์ฆ‰ printyaho๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :)
๐Ÿ“ ํ•จ์ˆ˜ ์ˆ˜ํ–‰์‹œ๊ฐ„ ์ฒดํฌ์‹œ ์•„์ฃผ ์œ ์šฉํ•˜๊ฒ ์ฃ ? ๐Ÿ˜Š

Fancy Decorator : with Args

๐Ÿ˜ƒ ์ข€ ๋” ๋‚˜์•„๊ฐ€ Decorator์— ์ธ์ž๋„ ์ค„ ์ˆ˜ ์žˆ๊ณ , ์‹ค์ œ ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ช‡๊ฐ€์ง€ ์กฐ์น˜๋ฅผ ์ข€ ๋” ์ทจํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๐Ÿค” ์—ฌ๋Ÿฌ๊ฐœ์˜ Decorator๊ฐ€ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์— ์ ์šฉ๋œ๋‹ค๋ฉด, ํ•จ์ˆ˜๋ช…์ด ์ œ๋Œ€๋กœ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด์ง€์š”!

์ž์„ธํ•œ ๋‚ด์šฉ์€ https://dojang.io/mod/page/view.php?id=2429 ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค :)

๐Ÿ˜Ž ์ฆ‰, Decorator์— ์ธ์ž๋ฅผ ์ฃผ๊ณ , ๊ฐ€๋ณ€์ธ์ž๊นŒ์ง€ ์‚ฌ์šฉํ•œ ์ตœ์ข… ํ…œํ”Œ๋ฆฟ์€ ๋Œ€๋žต ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import functools

def time_check(decimal):
    def decorator_time_check(func):
        @functools.wraps(func)
        def wrapper_time_check(*args, **kwargs):
            st = time.perf_counter()
            print('HERE IS {}`s TIME CHECK START!'.format(func.__name__))
            value = func(*args, **kwargs)
            et = time.perf_counter()
            print('HERE IS {}`s TIME! : {}'.format(func.__name__, round(et-st, decimal)))
            return value
        return wrapper_time_check
    return decorator_time_check

@time_check(decimal=12)
def calc_repeat(rep=10**6):
    sum = 0
    for i in range(rep):
        sum += i
    return sum

calc_repeat()

๐Ÿ˜Ž ์ˆ˜ํ–‰ ์‹œ๊ฐ„์„ ์†Œ์ˆซ์  ๋ช‡์ž๋ฆฌ๊นŒ์ง€ ๋„ฃ์„ ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ decorator ๋ณ€์ˆ˜ 'decimal'์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ,
๐Ÿ˜ func์˜ ์ธ์ž๋ฅผ ๊ฐ€๋ณ€ ์ธ์ž ์ฒ˜๋ฆฌํ•˜์—ฌ, ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์˜ค๋”๋ผ๋„ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๐Ÿ˜€ ์–ด์ฐŒ๋˜์—ˆ๊ฑด, Decorator๋Š” ์ผ์ข…์˜ ํ…œํ”Œ๋ฆฟ ๊ฐ™์€ ๋Š๋‚Œ์ด๊ธฐ์—, ์š”๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•ด๋†€๊ณ  ์ €๋„ ๊ทธ๋ƒฅ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ํŽธ์ž…๋‹ˆ๋‹ค :)

์ •๋ฆฌํ•˜๋ฉฐ

๐Ÿ˜Š ์˜ค๋Š˜์€ ๊ฐ„๋žตํžˆ Decorator์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
๐Ÿ˜Ž ๋‹จ์ˆœํžˆ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ์ธก์ • ์ด์™ธ์—๋„ ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” Decorator!
๐Ÿ˜‰ ์ž˜ ์•Œ์•„๋‘๋ฉด ๋ณต์žกํ•ด๋ณด์ด๋Š” ์˜คํ”ˆ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋’ค์ ๊ฑฐ๋ฆด๋•Œ๋„ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค :)
๐Ÿคž ๊ทธ๋Ÿผ, ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”!

profile
MLOps, ML Engineer. ๋ฐ์ดํ„ฐ์—์„œ ์‹œ์Šคํ…œ์œผ๋กœ, ์‹œ์Šคํ…œ์—์„œ ๊ฐ€์น˜๋กœ.

0๊ฐœ์˜ ๋Œ“๊ธ€