Python 개발자는 데코레이터를 사용하여 호출 가능 자체를 영구적으로 수정하지 않고도 호출 가능 함수, 메서드 또는 클래스의 동작을 확장하고 수정할 수 있습니다. 간단히 말해서 함수나 클래스를 수정하는 데 사용되는 호출 가능한 개체라고 말할 수 있습니다.
함수 데코레이터는 함수 참조를 인수로 받아들이고 그 주위에 래퍼를 추가하고 래퍼가 있는 함수를 새 함수로 반환하는 함수입니다.
예를 들어 함수 데코레이터를 이해합시다.
코드1
@decorator def func(arg): return "value"
위의 코드는 다음과 같습니다.
코드2
def func(arg): return "value" func = decorator(func)
따라서 위에서 보면 데코레이터가 단순히 함수를 인수로 받아 반환하는 또 다른 함수임을 알 수 있습니다.
데코레이터는 기본적으로 다른 함수를 "장식"하거나 "래핑"하며 아래 예에서 설명한 대로 래핑된 함수가 실행되기 전후에 코드를 실행할 수 있습니다.
def our_decorator(func): def function_wrapper(x): print("Before calling " + func.__name__) func(x) print("After calling " + func.__name__) return function_wrapper def foo(x): print("Hi, foo has been called with " + str(x)) print("We call foo before decoration:") foo("Hi") print("We now decorate foo with f:") foo = our_decorator(foo) print("We call foo after decoration:") foo(90)
출력
We call foo before decoration: Hi, foo has been called with Hi We now decorate foo with f: We call foo after decoration: Before calling foo Hi, foo has been called with 90 After calling foo
위의 내용이 조금 복잡하다고 생각되면 가장 간단한 데코레이터를 작성해 보겠습니다.
def null_decorator(func): return func
위의 null_decorator는 callable(function)이며, 다른 콜러블을 입력으로 취하고 수정하지 않고 동일한 입력 콜러블을 반환합니다.
다른 함수를 데코레이션(또는 랩핑)하여 위의 가장 간단한 데코레이터를 확장해 봅시다.
def null_decorator(func): return func def greet(): return "Hello, Python!" greet = null_decorator(greet) >>> greet() 'Hello, Python!'
위에서 우리는 Greeting 함수를 정의한 다음 null_decorator 함수를 통해 실행하여 즉시 장식했습니다.
위의 파이썬 장식 프로그램을 작성하는 훨씬 간단한 방법은 (greet에서 명시적으로 null_decorator를 호출한 다음 Greeting 변수를 재할당하는 대신) python @syntax를 사용하여 한 번에 함수를 장식하는 것입니다.
@null_decorator def greet(): return "Hello, Python!" >>> greet() 'Hello, Python!'