노력에는 지름길이 없으니까요

파이썬, 데코레이션 본문

Python

파이썬, 데코레이션

데건 2024. 7. 15. 11:28
728x90

심화과정에 속하는 기술이라고는 했지만,

예전에 사용법을 제대로 알아두지 않았던 탓에 애를 먹었던 기억이 있어서 이번 기회에 조사해두려고 한다.

 

데코레이션이란?

  • 데코레이터(Decorator)는 파이썬에서 함수나 메서드의 기능을 확장하거나 수정하는 기능
  • 데코레이터는 함수나 메서드를 인자로 받아 해당 함수나 메서드를 변경하거나 래핑하는 함수이며, 이를 통해 코드를 더 간결하고 재사용 가능하게 만들 수 있다.
  • 즉, 기존의 함수를 따로 수정하지 않고도 추가 기능을 넣고 싶을 때 사용

기본 구조

def decorator_function(original_function):
    def wrapper_function(**kwargs):
        # 함수 호출 전에 실행되는 코드
        result = original_function(**kwargs)
        # 함수 호출 후에 실행되는 코드
        return result
    return wrapper_function

 

 

def my_decorator(func): #func이 두개 이상 될 가능성도 있나?
    print(f"시작!!!!!!!! my_decorator에서 출력하는 문자열 {func}")
    def wrapper(test1=7, test2=8): #이 wrapper가 say_hello, test_first에 해당함
        print("my_decorator 내 wrapper 메소드")
        func(test1, test2)
        print("my_decorator 내 wrapper 메소드")
    print(f"끝!!!!!!!! my_decorator에서 출력하는 문자열 {func}")
    
    return wrapper

@my_decorator
def say_hello(test1, test2):
    if test1 >50 : print(f"Hello! {test1} 그리고 {test2}")
    else: print("Hello!")

@my_decorator
def test_first(test1, test2):
    print(f"테스트 {test1} 그리고 {test2}")

say_hello(100,200)
say_hello()
test_first(1,2)

 

결과

 

 

텐서플로우에서 자주 쓰이게 됨

 

텐서플로우는 그래프 연산 방식을 사용함

유용하게 사용한다면 더 빠르게 코드를 실행할 수 있겠으나, 항상 만능은 아니다.

계산량이 적고 작은 연산이 많이 있는 상황에서는 유리하지만, 계산량이 큰 연산이 있는 경우에는 속도 향상이 크게 차이나지 않는다.

 

 

출력되는 횟수와 순서가 잘 이해가 가지 않아서 튜터님께 질문했는데, 조금 정리가 됐다.

@my_decorator가 선언되는 순간 my_decorator라는 원본함수가 실행되면서 내부에 있는 print문이 전부 출력된 것.

그리고 각각 대체되는 함수가 불려지면서 대체된 각각의 wrapper 함수가 실행되었다고 이해하면 된다. 

728x90
반응형

'Python' 카테고리의 다른 글

그래프 (Graph)의 정의, 장단점, 구현법  (1) 2024.07.18
dictionary(사전형) 정리  (0) 2024.07.15
파이썬, 불리언 인덱싱이란?  (0) 2024.07.12
파이썬 클래스, init과 self에 대한 이해  (0) 2024.07.12
파이썬 포맷팅  (0) 2024.07.11