Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

파이썬의 함수 데코레이터?

<시간/>

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!'