말 그래로 기존의 함수에 약간의 첨가를 할 때 사용한다.

 

예를 들어보자.

name을 input으로 받으면, 포매팅 문자열로 넣어서 반환해주는 함수이다.

def greet(name):
    return f"Hello, {name}!"

print(greet("Alice"))

output: Hello, Alice

 

그런데 이러한 함수가 100가지가 되고,

모든 함수의 output을 대문자로 바꾼다고 생각해보자.

 

그러면 위의 함수는 다음과 같이 바꿔야한다.

def greet(name):
    return f"HELLO, {name.upper()}!"

print(greet("Alice"))

Hello -> HELLO

name -> name.upper()

 

이렇게 바꾸는 과정을 100번 해야한다.

 

그렇다면, 함수를 만들어서 재정의하는 건 어떨까?

def uppercase(func):
    def wrapper(text):
        result = func(text)
        return result.upper()
    return wrapper


def greet(name):
    return f"Hello, {name}!"

greet = uppercase(greet)

print(greet("Alice"))

이렇게 하면 이전의 방법보다는 편하지만, 결국 재정의 과정을 100번해야한다.

(greet = uppercase(greet))

 

더 편한 방법이 없을까?

이럴때 사용하는 방법이 decorator pattern이다.

def uppercase_decorator(func):
    def wrapper(text):
        result = func(text)
        return result.upper()
    return wrapper

@uppercase_decorator
def greet(name):
    return f"Hello, {name}!"

print(greet("Alice"))

 

재정의하고자 하는 함수 바로위에, @재정의함수를 사용하면 된다.

 

+ Recent posts