๋ฐ์ฝ๋ ์ดํฐ (Decorator) ?
- ํจ์ ์๋ค์ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ ์ ์ฝ๊ฒ ํจ์๋ฅผ ํ์ฉํ ์ ์๋ ๊ธฐ๋ฒ
- Closure function
- ์ฌ๋ฌ ํจ์์ ๋์ผํ ๊ธฐ๋ฅ์ @๋ฐ์ฝ๋ ์ดํฐ ํ๋๋ก ๊ฐํธํ๊ฒ ์ถ๊ฐ
Closure function
- ํจ์์ ํด๋น ํจ์๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ๋ณต์ฌ, ์ ์ฅํด์ ๋ณ๋ ํจ์๋ก ํ์ฉํ๋ ๊ธฐ๋ฒ
- ์ธ๋ถ ํจ์๊ฐ ์๋ฉธํ๋๋ผ๋, ์ธ๋ถ ํจ์ ์์ ์๋ ๋ก์ปฌ ๋ณ์ ๊ฐ๊ณผ ์ค์ฒฉํจ์(๋ด๋ถํจ์)๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅ
def outer_func(num):
#์ค์ฒฉ ํจ์์์ ์ธ๋ถ ํจ์์ ๋ณ์์ ์ ๊ทผ ๊ฐ๋ฅ
def inner_func():
print(num)
return 'hi'
return inner_func #์ค์ฒฉ(๋ด๋ถ) ํจ์ ์ด๋ฆ์ ๋ฆฌํด
closure_func = outer_func(10) #First-class function
closure_func() #<---Closure ํธ์ถ
#10
#'hi'
- ์์ ์ฝ๋ ๋ถ์
- ์์ ์์ ์์ closure_func์ด ๋ฐ๋ก closure
- closure_func = outer_func(10)์์ outer_funcํจ์๋ ํธ์ถ ์ข ๋ฃ
- closure_func()์ ๊ฒฐ๊ตญ inner_func ํจ์๋ฅผ ํธ์ถ
- outer_func(10) ํธ์ถ ์ข ๋ฃ ์ num ๊ฐ์ ์์ด์ก์ผ๋, closure_func()์์ inner_func์ด ํธ์ถ๋๋ฉด์ ์ด์ ์ num ๊ฐ 10์ ์ฌ์ฉํจ
- del outer_func ===> outer_func ํจ์๋ฅผ ์์ ์ญ์ ํด๋, inner_func()์ num์ ๊ฐ 10์ ์ด์์๋ค!
๋ฐ์ฝ๋ ์ดํฐ ์์ฑ๋ฒ
#๋ฐ์ฝ๋ ์ดํฐ ์์ฑ
def test_decorator(func): #func : ํจ์ ์์ ๋ฃ์ ํจ์
def wrapper(): #ํธ์ถํ ํจ์๋ฅผ ๊ฐ์ธ๋ ํจ์
print('ํจ์ ํธ์ถ ์ ') #ํจ์ ์์์ ์คํํ ๋ด์ฉ
func() #ํจ์
print('ํจ์ ํธ์ถ ํ') #ํจ์ ๋ค์์ ์คํํ ๋ด์ฉ
return wrapper #closure ํจ์๋ก ๋ง๋ ๋ค
#๋ฐ์ฝ๋ ์ดํฐ ์ ์ฉ
@test_decorator
def logger_check():
print("ok")
logger_check()
'''
ํจ์ ํธ์ถ ์
ok
ํจ์ ํธ์ถ ํ
'''
- closure function ์ผ๋ก ๋ฐ์ฝ๋ ์ดํฐ ํ์ด๋ณด๊ธฐ
def test_decorator(func):
def wrapper():
print('ํจ์ ํธ์ถ ์ ')
func() #ํจ์
print('ํจ์ ํธ์ถ ํ')
return wrapper
def logger_check():
print('ok')
decorated_func = test_decorator(logger_check)
decorated_func()
#@decorator ์ฌ์ฉ๊ณผ ๋์ผํ ๊ฒฐ๊ณผ
'''
ํจ์ ํธ์ถ ์
ok
ํจ์ ํธ์ถ ํ
'''
- ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ํจ์์ Decorator ์ ์ฉ
#์ ํจ์ฑ ๊ฒ์ฌ decorator
def type_checker(function):
def inner_func(digit1, digit2):
if (type(digit1) != int) or (type(digit2) != int):
print('only integer support')
return
return function(digit1, digit2)
return inner_func
@type_checker
def multiplexer(digit1, digi2):
return digit1 * digit2
muliplexer(1.1, 2) #only integer support
- ํ๋ผ๋ฏธํฐ์ ๊ด๊ณ์์ด ๋ชจ๋ ํจ์์ ์ ์ฉ ๊ฐ๋ฅํ Decorator
- ํ๋ผ๋ฏธํฐ๋ ์ด๋ค ํํ์ด๋ ๊ฒฐ๊ตญ (args, **kwargs)๋ก ํํ ๊ฐ๋ฅ
- ๋ด๋ถํจ์ ํ๋ผ๋ฏธํฐ์ ์ ์ฉ => ์ด๋ค ํจ์์ด๋ ๋ฐ์ฝ๋ ์ดํฐ ์ ์ฉ ๊ฐ๋ฅ
#๋ฐ์ฝ๋ ์ดํฐ ์์ฑ
def general_decorator(function):
def wraaper(*args, **kwargs):
print('function is decorated')
return function(*args, **kwargs)
return wrapper
#๋ฐ์ฝ๋ ์ดํฐ ์ ์ฉ
@general_decorator
def calc_square(digit):
return digit * digit
@general_decorator
def calc_plus(digit1, digit2):
return digit1 + digit2
@general_decorator
def calc_quad(digit1, digit2, digit3, digit4):
return digit1 * digit2 * digit3 * digit4
- ๋ฐ์ฝ๋ ์ดํฐ ์ฌ๋ฌ ๊ฐ ์ง์
def decorator1(function)
def wrapper():
print('decorator1')
funciton()
return wrapper
def decorator2(function):
def wrapper():
print('decorator2')
funciton()
return wrapper
#๋ฐ์ฝ๋ ์ดํฐ ๋์ด ์์ผ๋ก ์คํ ๋จ
@decorator1
@decorator2
def hello():
print('hello')
"""
decorator1
decorator2
hello
"""
#์ฐธ๊ณ
'Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] python comprehension (0) | 2024.01.31 |
---|