πŸ—‚οΈ

4.7.8. decorator

λ°μ½”λ ˆμ΄ν„°λŠ” 사전적 의미둜 "μž₯식가"λΌλŠ” 의미λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. 파이썬의 Objectλ₯Ό κΎΈλ©°μ£ΌλŠ” 역할을 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ •ν™•νžˆλŠ” ν•¨μˆ˜λ₯Ό 인수둜 λ°›λŠ” κ°μ²΄μž…λ‹ˆλ‹€. 클래슀 μ±•ν„°μ—μ„œ @staticmethod둜 μ†Œκ°œκ°€ λ˜μ—ˆμ–΄μš”.
μž…λ ₯
def decorator(printname_func): #3 def wrapper(w_name): #5 print("μ΄λ ‡κ²Œ Object μ•žμ—λ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.") printname_func(w_name) #6 print("μ΄λ ‡κ²Œ Object 뒀에도 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.") return wrapper #4 @decorator #2 def printname(name): #7 print(name) printname('leehojun') #1
Β 
좜λ ₯
μ΄λ ‡κ²Œ Object μ•žμ—λ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. leehojun μ΄λ ‡κ²Œ Object 뒀에도 μ‹€ν•Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
Β 
μœ„μ˜ μ½”λ“œμ—μ„œ ν•¨μˆ˜μ˜ 호좜이 #1μ—μ„œ μΌμ–΄λ‚©λ‹ˆλ‹€. 그러면 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•˜λŠ”λ° μ•žμ— λ°μ½”λ ˆμ΄ν„°κ°€ μžˆμœΌλ―€λ‘œ #2λ₯Ό μ‹€ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€. #3μ—μ„œ νŒŒλΌλ―Έν„°λ‘œ λ°›κ³  μžˆλŠ” 것은 ν•¨μˆ˜μž…λ‹ˆλ‹€. #4μ—μ„œ return κ°’μœΌλ‘œ wrapperλ₯Ό ν˜ΈμΆœν•˜κ³  μžˆμœΌλ―€λ‘œ #5둜 κ°€κ²Œ λ©λ‹ˆλ‹€. μ—¬κΈ°μ„œ νŒŒλΌν‚€ν„°λ‘œ λ°›κ³  μžˆλŠ” 것은 #1의 μ•„κ·œλ¨ΌνŠΈμž…λ‹ˆλ‹€. #6 μ•ž λ’€λ‘œ print ν•¨μˆ˜λ₯Ό λ„£μ–΄ μ›λž˜μ˜ λ‹€μ–‘ν•œ ν•¨μˆ˜λ₯Ό 덧뢙일 수 μžˆλ‹€λŠ” 것을 λ³΄μ—¬λ“œλ¦¬κ³  μžˆμŠ΅λ‹ˆλ‹€. #6μ—μ„œ #7ν•¨μˆ˜κ°€ 호좜되고 싀행이 λ©λ‹ˆλ‹€.
Β 
print(printname) <funtion decorator.<locals>.wrapper at 0x0338B8E8>
Β 
μœ„ μ½”λ“œμ—μ„œ μ•Œ 수 μžˆλ“―μ΄ λ°μ½”λ ˆμ΄ν„°κ°€ μž₯μ‹ν•˜κ³  μžˆλŠ” ν•¨μˆ˜λŠ” λ°μ½”λ ˆμ΄ν„°μ˜ wrapperλ₯Ό 가리킀고 μžˆμŠ΅λ‹ˆλ‹€.
Β 
λ°μ½”λ ˆμ΄ν„°λŠ” ν•¨μˆ˜λ₯Ό μ’€ 더 μ§κ΄€μ μœΌλ‘œ λ³€ν™”μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ Django 같은 Python WEB frameworμ—μ„œ λ‘œκ·Έμž„ν•œ μ‚¬μš©μžμ—κ²Œλ§Œ ν•¨μˆ˜μ˜ κΆŒν•œμ„ ν—ˆλ½ν•  λ•Œ @auth같이 μ‚¬μš© ν•  수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.
Β 
πŸ’‘
파이썬 ν•¨μˆ˜μ˜ νŠΉμ§•
파이썬 ν•¨μˆ˜λŠ” 일급 객체(First class object)μž…λ‹ˆλ‹€. νŒŒμ΄μ¬μ€ 일반적으둜 λ‹€λ₯Έ 객체듀에 μ‚¬μš©λ˜μ—ˆλ˜ 연산듀을 λŒ€λΆ€λΆ„ μ§€μ›ν•˜μ£ . μ•„λž˜μ™€ 같이 λŒ€μž… 연산을 예둜 λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
Β 
a = 10
Β 
μ•žμ„œ a도 object이고 10도 objectλΌλŠ” 것을 μ‹€μŠ΅μœΌλ‘œ μ•Œκ³  계싀 κ²ƒμž…λ‹ˆλ‹€. typeμ΄λΌλŠ” μ—°μ‚°μžλ₯Ό 톡해 μ•Œλ €λ“œλ Έμ—ˆμ£ .
Β 
def printhello(): #1 print("hello") hello=printhello #2
Β 
μ—¬κΈ°μ„œ printhello ν•¨μˆ˜λŠ” ν•˜λ‚˜μ˜ objectκ°€ λ©λ‹ˆλ‹€. helloλΌλŠ” λ³€μˆ˜λ„ object이죠. κ·ΈλŸ¬λ‹ˆ ν•¨μˆ˜λ₯Ό λŒ€μž…ν•˜λŠ” 연산도 κ°€λŠ₯ν•©λ‹ˆλ‹€.
Β 
>>>hello() hello
Β 
μΈμžκ°’λ„ λ™μΌν•˜κ²Œ 전달이 λ©λ‹ˆλ‹€.
Β