파이썬심화-4 데코레이터
데코레이터
- 장식자 라고도 함
- 어떤 함수가 있을 때 해당 함수를 직접적으로 수정하지 않고 함수에 기능을 추가하고 싶을 때 사용
def hello():
print("*"*10)
print("hello")
print("*"*10)
def hi():
print("*"*10)
print("hi")
print("*"*10)
hello()
hi()
# 함수의 이름을 출력하고 앞 뒤로 *을 출력하는 기능이 있을 때
# 다른 함수도 시작과 끝에 *을 출력하려면 print를 계속 넣어야 하는 번거로움이 있음
# 이때 데코레이터를 사용
**********
hello
**********
**********
hi
**********
데코레이터 만들기
decorate()
함수는 함수를 인자로 받고,wrapper()
라는 함수를 선언wrapper()
함수는decorate()
함수의 인자로 넘어온 함수를 호출함
def decorate(func):
def wrapper():
print("*"*10)
func()
print("*"*10)
return wrapper
def hello():
print("hello")
def hi():
print("hi")
hello = decorate(hello) # 데코레이터에 호출할 함수를 넣음
hello() # 반환된 함수를 호출
hi = decorate(hi)
hi()
**********
hello
**********
**********
hi
**********
데코레이터 사용
- 호출할 함수 위에
@
기호를 사용함
@decorate
def hello():
print("hello")
hello()
@decorate
def hi():
print("hi")
hi()
**********
hello
**********
**********
hi
**********
매개변수와 리턴값
def decorate(func): # 호출할 함수를 매개변수로 받음
def wrapper(a, b): # 호출할 함수의 매개변수와 똑같이 지정
def decorate(func):
def wrapper(a, b): # 호출한 함수의 매개변수와 동일하게 지정
print(f"a값: {a}, b값: {b}, 더한값: {a+b}")
value = func(a, b)
return value
return wrapper
@decorate
def add(a, b):
return a + b
add(10, 20)
데코레이터
a값: 10, b값: 20, 더한값: 30
30
매개변수가 있는 데코레이터
def parm_decorate(x): # 데코레이터가 사용할 매개변수 지정
def decorate(func): # 호출할 함수를 매개변수로 받음
def wrapper(a ,b): # 호출할 함수의 매개변수와 똑같이 지정
def is_multiple(x):
def real_decorator(func):
def wrapper(a, b):
r = func(a, b)
if r % x == 0:
print(f'반환값은 {x}의 배수입니다.')
else:
print(f'반환값은 {x}의 배수가 아닙니다.')
return r
return wrapper
return real_decorator
@is_multiple(3)
def add(a, b):
return a + b
print(add(10, 20))
print(add(2, 5))
반환값은 3의 배수입니다.
30
반환값은 3의 배수가 아닙니다.
7
클래스 데코레이터
- 클래스로 데코레이터를 만들때는
__call__
메서드를 구현해야 함
class Decorate:
def __init__(self, func):
self.func = func
def __call__(self):
print("*"*10)
self.func()
print("*"*10)
@Decorate
def hello():
print("hello")
hello()
**********
hello
**********
- 매개변수가 있는 클래스 데코레이터
class Decorate:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
result = self.func(*args, **kwargs)
print(f"args={args}, kwargs={kwargs}, 값: {result}")
return result
@Decorate
def add(a, b):
return a + b
print(add(10, 20))
print(add(a=10, b=50))
args=(10, 20), kwargs={}, 값: 30
30
args=(), kwargs={'a': 10, 'b': 50}, 값: 60
60
class Decorate:
def __init__(self, x):
self.x = x
def __call__(self, func):
def wrapper(*args, **kwargs):
func(*args, **kwargs)
return wrapper
@Decorate(3)
def add(a, b):
pass
댓글남기기