파이썬의 데코레이터

3530 단어 tutorialpython
데코레이터: 데코레이터와 그 용도에 대한 영원한 혼란을 종식시킵니다.

깃허브나 다른 코드베이스를 살펴볼 때마다 우리는 종종 파이썬처럼 보이는 것을 보게 됩니다.

@decorator
def my_function():
    pass


이것은 파이썬에서 데코레이터로 알려져 있으며 매우 편리하고 강력합니다. 데코레이터는 함수 자체를 변경하지 않고 함수의 동작을 변경해야 할 때 사용됩니다. 말이된다? 이제 됩니다.
파이썬의 거의 모든 것이 객체라고 할 수 있습니다. 함수도 객체(일급)입니다. 따라서 변수에 함수를 할당할 수 있습니다.

def my_function():
    print("hello dev community")

#we can assign the function without executing to the variable func
func=my_function


함수는 일류 객체입니다.
이전에 표시된 대로 변수에 할당할 수 있습니다.
또한 다른 함수에 인수로 전달될 수 있으며 다른 함수에 중첩될 수도 있습니다.

def outer(message):
    def inner():
        print("hi "+ message)
    return inner

hi = outer("dev community")
bye = outer("dev community")

#this executes the inner function.
hi()
bye()


산출

hi dev community
bye dev community


여기에 두 개의 중첩 함수outerinner가 있습니다.outer는 실행하지 않고 inner를 반환합니다. 변수에 outer를 할당하고 변수를 실행하면 실제로 특정 인수로 inner가 실행됩니다.
이를 클로저라고 합니다. 클로저는 전역 값의 사용을 피할 수 있고 어떤 형태의 데이터 숨김을 제공합니다. 또한 문제에 대한 객체 지향 솔루션을 제공할 수도 있습니다.

데코레이터는 클로저를 광범위하게 사용합니다.
데코레이터는 message를 인수로 사용하는 대신 함수를 인수로 사용합니다. 데코레이터를 단계별로 만들어 보겠습니다.

def decorator_function(original_function):
    def wrapper_function():
        #do something before the function
        print("hello from wrapper")
        return original_function()
    return wrapper_function

def display():
    print("hello from display")

decor_display = decorator_function(display)
decor_display()


코드는 이전에 생성한 클로저와 매우 유사합니다. 이제 decorated_function를 통해 함수를 전달하고 있습니다.
decor_display를 할당하면 decorator_function가 실행되고 wrapper_function가 반환됩니다. 그런 다음 마지막 줄에서 wrapper_function를 호출하여 decor_display에 저장된 decor_display를 실행합니다. 이제 wrapper_function는 인쇄 문을 실행하고 컨텍스트에서 original_functiondisplay를 실행하고 최종적으로 다음을 출력합니다.

hello from wrapper
hello from display


확실히 받아들여야 할 것이 많았습니다. 프로세스를 다시 살펴보고 논리가 명확해지기를 바랍니다.
여기서 우리는 성공적으로 display 함수 앞에 추가 줄을 인쇄하여 hello from wrapper 함수의 동작을 변경했습니다. display 함수 자체를 변경하지 않고 decorator_function 를 사용하여 동작을 변경했습니다.

Python을 사용하면 @decorator_function_name를 사용하여 동일한 작업을 수행할 수 있습니다. 변수에 decorator_function를 할당하는 대신 함수 앞에 @decorator_function를 사용하여 모든 함수에 할당할 수 있습니다.

def decorator_function(original_function):
    def wrapper_function():
        #do something before the function
        print("hello from wrapper")
        return original_function()
    return wrapper_function


#this works same as decorator_function(display)
@decorator_function
def display():
    print("hello from display")

display()


산출

hello from wrapper
hello from display


결론
데코레이터는 강력한 도구이며 로깅, 성능 테스트, 캐싱 수행, 권한 확인 등과 같은 다양한 목적을 위해 많은 코드베이스에서 사용됩니다. 이 튜토리얼이 유용하다고 생각되면 아래에 주석을 달아주십시오. 읽어주시고 배워주셔서 감사합니다.

->

좋은 웹페이지 즐겨찾기