데코레이터란?
- callback 함수랑 비슷
- 함수를 인자로 받아서 나중에 호출하려고
- 함수의 앞뒤로 어떤 작업을 해 준다!
- 코드를 깔끔하게 유지하면서, 코드 재사용성을 높여줌
- 데코레이터를 사용하여 코드의 의도를 명확하게 전달할 수 있음
import json
def writefile(func):
def wrap_func(a,b):
f=open('result.txt','w')
keys=["a","b","a+b"]
values=[a,b,a+b]
f.write(json.dumps(dict(zip(keys,values))))
f.close()
return wrap_func
@writefile
def add(a, b):
return a + b
add(10,20)
➡️여기서 add함수가 하는 것?
데코레이터(@writefile) 밑에 함수는 아규먼트로 들어가게 되는데요, 그렇게 된다면 def writefile(func): -> def writefile(add):가 되는것 (당연히 파라미터 변수라 a나 원하시는 이름으로 지정 가능!)
그러고 나서 wrap_func 함수 안에서 add(함수: 기능)을 활용하시면 됩니다
def print_hello(func):
def wrap_func():
print('hello start')
func()
print('hello end')
return wrap_func
@print_hello
def func1():
print('func1 입니다.')
func1()
def 인사말(func):
def wrap_func():
print('SAY THE NAME! 안녕하세요 세븐틴')
func()
return wrap_func
@print_hello
def 자기소개1()
print('라이언입니다')
def 자기소개2()
print('승관입니다')
def 세븐틴(func):
def wrap_func():
print('SAY THE NAME SEVENTEEN! 안녕하세요 세븐틴')
func()
return wrap_func
@세븐틴
def 자기소개1():
print('도겸입니다')
@세븐틴
def 자기소개2():
print('승관입니다')
자기소개2()
'''
SAY THE NAME SEVENTEEN! 안녕하세요 세븐틴
승관입니다
'''
def 세븐틴(func):
def wrap_func(이름):
print('SAY THE NAME SEVENTEEN! 안녕하세요 세븐틴')
func(이름)
return wrap_func
@세븐틴
def 자기소개(name):
print(f'{name}입니다')
자기소개('에스쿱스')
'''
SAY THE NAME SEVENTEEN! 안녕하세요 세븐틴
에스쿱스입니다
'''
def 전처리(func):
def wrap_func(iterable):
iterable = list(map(int, iterable))
print(func(iterable))
return wrap_func
@전처리
def 평균(l):
return sum(l) / len(l)
평균(['1', 2, 3, '4'])
def 전처리(func):
def wrap_func(iterable):
return func(list(map(int, iterable)))
return wrap_func
@전처리
def 평균(l):
return sum(l) / len(l)
평균(['1', 2, 3, '4'])
def 전처리(func):
def wrap_func(iterable):
i = list(map(int, iterable))
calculate = func(i)
result = str(calculate) + '%'
return result
return wrap_func
@전처리
def 평균(l):
return sum(l) / len(l)
평균(['1', 2, 3, '4'])

# 데코레이터에 argument를 넣는 방법
def deco1(name):
def deco2(func):
def wrapper():
print('decorator1')
func()
return wrapper
return deco2
# 데코레이터를 여러 개 지정
@deco1('hojun')
def hello():
print('hello')
hello()
# 2중 decorator
def decorator1(func):
def wrapper():
print(f'deco1 > wrapper > func : {id(func)}')
func()
print(f'deco1 > wrapper : {id(wrapper)}')
return wrapper
def decorator2(func):
def wrapper():
print(f'deco2 > wrapper > func : {id(func)}')
func()
print(f'deco2 > wrapper : {id(wrapper)}')
return wrapper
# 데코레이터를 여러 개 지정
@decorator1
@decorator2
def hello():
print('hello')
hello()
