Python에서 여러 데코레이터 구현
Python의 가장 두드러진 기능 중 하나는 데코레이터를 사용하여 함수 또는 클래스의 동작을 변경할 수 있다는 것입니다. 데코레이터를 사용하여 프로그램 내부에 이미 코드가 있는 프로그램의 일부를 변경할 수 있습니다.
데코레이터는 실행 중에 해당 프로그램의 일부를 변경하는 프로그램의 코드 줄입니다. 컴파일하는 동안 프로그램에 변경 사항을 적용하는 프로세스를 메타프로그래밍이라고 합니다.
이 기사에서 독자는 데코레이터의 기본 사항, 즉 Python에서 데코레이터가 선언, 구현 및 연결되는 방법을 살펴봅니다.
데코레이터 구현: 일급 객체로서의 기능
문법적으로 함수를 반복 가능한 객체로 전달하여 데코레이터를 선언할 수 있습니다. 이것은 파이썬의 모든 것이 일급 객체이기 때문에 가능합니다. 따라서 모든 Python 구성을 매개 변수로 전달하거나 변수에 할당할 수 있습니다.
즉, 모든 클래스, 함수 및 선언된 변수를 객체로 전달할 수 있습니다. 아래 예는 이를 보여줍니다.
암호:
def func():
def inner():
print("Chocolate")
return inner
taste = func()
taste()
출력:
"C:\Users\Win 10\main.py"
Chocolate
Process finished with exit code 0
여기에서 상위 함수 func()
에 내부 함수 inner()
가 있는 중첩 함수가 생성됩니다. inner()
함수는 명령문을 인쇄하고 함수 내부에 있는 동안 자신을 반환합니다.
데코레이터 함수 func()
는 데이터를 빈 개체 함수 taste
에 전달합니다. 이렇게 장식합니다.
이 개체 함수에 기능이 있는 경우 데코레이터도 변경했을 것입니다. 이 기사의 후반부에서는 데코레이터를 사용하여 함수 변경을 유도하는 방법을 볼 수 있습니다.
Python에서는 함수를 다른 함수의 인수로 전달하고 반환할 수 있습니다. 데코레이터는 함수를 인수로 받아들이고 이 개념을 사용하여 결과를 반환할 수도 있습니다.
아래 예제는 매개변수화된 데코레이터를 보여줍니다. 더 쉽게 이해하려면 함수를 실제 개체로 생각하십시오.
Python에서 매개변수화된 데코레이터 구현
데코레이터가 다른 함수를 매개변수화된 인수로 취하는 방법을 이해하기 위해 베이커리 예제를 제시합니다.
여기서 bakery
는 개체 함수 obj_func()
를 매개 변수로 사용하는 매개 변수화된 메서드입니다. 이 메서드 내에서 Dough
를 인쇄하는 중첩 함수 inner()
가 선언됩니다.
그 후 obj_func()
가 호출되어 inner()
함수를 반환합니다. 개체 함수를 호출하면 장식 중인 함수가 호출됩니다.
자세히 관찰할 수 있듯이 bakery
는 obj_func()
인수를 사용하는 매개 변수화된 메서드입니다. 이 인수는 wheat()
함수에 불과하며 inner()
함수가 인쇄
문.
암호:
def inner():
print("Dough")
obj_func()
return inner
장식되어야 하는 이 기능, 즉 밀
에는 인쇄
문이 있습니다. 빵으로 전환
.
암호:
def wheat():
print("Turned into bread")
장식된 함수를 저장하는 새 객체 함수 final
이 생성됩니다.
object_function = decorator(decorated_function)
구문은 inner()
함수의 속성을 구현하는 매개변수화된 메서드 bakery
에 객체로 전달하여 wheat()
함수를 장식합니다.
암호:
final = bakery(wheat)
final()
장식된 함수는 final
개체 함수에 저장됩니다. 컴파일되면 프로그램은 inner()
함수를 먼저 실행한 다음 obj_func()
를 호출하여 wheat()
개체 함수를 전달하고 그 내용을 인쇄합니다.
느슨하게 말하면 빵집에 밀을 넣으면 빵으로 바뀌고 결과는 다음과 같이 인쇄됩니다. 빵으로 변신
. 현실 세계에서 빵집이 작동하는 것처럼!
암호:
def bakery(obj_func):
def inner():
print("Dough")
obj_func()
return inner
def wheat():
print("Turned into bread")
final = bakery(wheat)
final()
출력:
"C:\Users\Win 10\main.py"
Dough
Turned into bread
Process finished with exit code 0
Python에서 @
를 사용하여 데코레이터 구현
이 세그먼트는 @function_name
구문을 사용하여 함수를 장식하는 방법을 보여줍니다. 이 예에서는 다음과 같은 프로그램이 사용됩니다.
- 매개변수화된 중첩 함수
- 변수 x와 y 사이의 값을 확인하고 분자가 분모보다 작으면 값을 교환하는 내부 함수;
- 교환된 값으로 장식되는 세 번째 함수는 두 숫자를 나누어서 인쇄합니다.
데코레이터 함수 decor_func
는 객체 함수 obj1
을 매개변수로 받습니다. 내부에는 분모 필드에 더 큰 숫자가 제공되면 값을 교환하는 내부 함수가 생성됩니다.
암호:
def decor_func(obj1):
def swap(x, y):
pass
내부 함수 swap
매개변수는 함수 quot
매개변수와 동일하므로 obj1
내부에 저장된 스왑된 값은 컴파일러가 실행하기 전에 변경된 값을 함수 quot
에 전달하여 내부 함수에서 반환됩니다.
@decor_func
구문은 예제에서 quot
함수 위에 선언됩니다. 이는 컴파일러에게 obj1
함수의 매개변수를 가져와서 quot
함수에 전달하도록 지시합니다.
암호:
def decor_func(obj1):
def swap(x, y):
if x < y:
temp = x
x = x + y - x
y = y + temp - y
return obj1(x, y)
return swap
# Syntax to Decorate function
@decor_func
def quot(x, y): # Displays quotient of variable x/y
print(x / y)
quot(2, 4)
출력:
"C:\Users\Win 10\main.py"
2.0
Process finished with exit code 0
Python에서 여러 데코레이터 구현
데코레이터 연결은 @function_name
이 선언된 횟수만큼 대상 함수가 반복적으로 데코레이션되도록 데코레이터를 서로 쌓는 기술입니다.
아래 프로그램에서 decor
와 decor1
이라는 두 개의 함수가 생성됩니다. 이러한 함수는 데코레이터이며 산술 연산을 수행하고 결과를 반환하는 내부 함수가 있습니다.
데코레이터를 연결하려면 데코레이션할 함수 위에 함께 정의해야 합니다. 또한 컴파일러는 데코레이터를 아래에서 위로 읽습니다.
즉, 함수 이름 바로 위에 있는 데코레이터가 먼저 구현되고 다른 데코레이터는 그 다음에 위쪽으로 구현됩니다.
암호:
@decor # Gets implemented second
@decor1 # Gets implemented first
def num():
return 5
아래 예제에서 num()
함수는 데코레이터 함수에 값을 직렬로 반환합니다. 처음에 decor1
은 값을 가져와 객체 함수 func()
에 전달하고 변경된 값을 num()
에 반환합니다.
마찬가지로 이 과정은 다른 데코레이터 함수에서도 반복됩니다. 마지막으로 num()
이 출력되면 50
이 출력됩니다.
암호:
# code for testing decorator chaining
def decor1(func):
def inner():
x = func()
return x * x
return inner
def decor(func):
def inner():
x = func()
return 2 * x
return inner
@decor
@decor1
def num():
return 5
print(num())
출력:
"C:\Users\Win 10\main.py"
50
Process finished with exit code 0
결론
이 기사는 데코레이터가 프로그램에서 어떻게 사용되는지 독자에게 명확한 그림을 제공했습니다. 독자는 함수에 데코레이터를 사용하는 방법, 데코레이터에 매개변수를 제공하는 방법 및 여러 데코레이터를 연결하는 방법을 배워야 합니다.