CodeGym /행동 /Python SELF KO /데코레이터

데코레이터

Python SELF KO
레벨 14 , 레슨 1
사용 가능

5.1 데코레이터 소개

데코레이터는 다른 함수를 인자로 받아 새 함수를 반환하는 함수야. 본래 함수의 행동을 변경하거나 확장해. 데코레이터는 코드의 가독성과 재사용성을 높이는데 사용돼.

데코레이터는 함수나 메소드의 소스 코드를 변경하지 않고 행동을 수정할 수 있게 해줘. 그래서 기능 추가, 로깅, 접근 제어 등의 작업에 널리 쓰여.

Python의 데코레이터 문법은 기호 @를 데코레이터 이름 앞에 사용해. 이 기호는 함수 정의 앞에 위치해.


@decorator
def my_function():
    pass

다음 코드와 동일해:


def my_function():
    pass
        
my_function = decorator(my_function)

여기서 무슨 일이 일어나는지 잘 생각해봐: 우리는 my_function 함수를 정의한 다음 decorator 함수로 교체해. 이때 decorator 함수는 우리 함수가 매개 변수로 전달돼. decorator 함수는 원하는 대로 우리 함수를 호출할 수 있어.

5.2 간단한 데코레이터 만들기

함수 호출 전과 후에 메시지를 출력하는 간단한 데코레이터를 만들어보자.


def my_decorator(func):
    def wrapper():
        print("함수 호출 전")
        func()
        print("함수 호출 후")

    return wrapper
        
@my_decorator
def say_hello():
    print("Hello!")
        
say_hello()

설명

데코레이터 (my_decorator): 이 함수는 함수 func를 인자로 받고, func를 호출하면서 호출 전후로 추가 행동을 더하는 새로운 함수 wrapper를 반환해.

데코레이터가 있는 함수 (say_hello): 함수 say_hello는 데코레이터 my_decorator로 감싸져서 호출 시 추가 행동이 더해져.

출력:


# 함수 호출 전
Hello!
# 함수 호출 후

5.3 인자를 받는 데코레이터

데코레이터는 인자를 받아서 보다 유연하게 설정할 수 있어.


def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                func(*args, **kwargs)

        return wrapper
        
    return decorator_repeat
        
@repeat(num_times=3)
def say_hello(name):
    print(f"Hello, {name}!")
        
say_hello("Alice")

설명

인자가 있는 데코레이터 (repeat): 이 함수는 num_times 인자를 받고 데코레이터 decorator_repeat를 반환해.

데코레이터 (decorator_repeat): 이 데코레이터는 함수 func를 받아 funcnum_times 횟수만큼 호출하는 새로운 함수 wrapper를 반환해.

데코레이터가 있는 함수 (say_hello): 함수 say_hello는 데코레이터 repeat 덕분에 세 번 호출돼.

출력:


Hello, Alice!
Hello, Alice!
Hello, Alice!
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION