[번역] Decorators in Python

폐쇄맨·2020년 8월 23일
0

번역

목록 보기
5/5
post-custom-banner

읽기전에..

그냥 GeeksForGeeks에서 데코레이터 페이지를 번역했다.

서론

파이썬에서, 함수는 first class object 이다. 그 말인즉슨,

  • 함수는 객체이다; 변수에 저장되어 질 수 있고, 다른 함수에서 리턴값이 될 수도 있다.
  • 함수는 다른 함수 내부에서 선언되어 질 수 있고, 다른 함수의 인자로 넘겨질 수도 있다.

데코레이터는 프로그래머가 함수 또는 클래스의 behavior를 조작한다는 점에서 굉장히 파워풀하고 유용한 파이썬 문법이다. 데코레이터는 직접적으로 함수를 조작하지 않고 함수의 기능을 확장하기 위해 함수를 감싼다.

데코레이터에서 함수는 다른 함수의 인자로 넘겨져 다음 wrapper 함수 내부에서 호출된다.

Syntax for Decorator

@gfg_decorator
def hello_decorator(): 
    print("Gfg") 
  
'''위의 코드는 다음과 동일하다 - 
  
def hello_decorator(): 
    print("Gfg") 
      
hello_decorator = gfg_decorator(hello_decorator)'''

위의 코드에서, gfg_decorator 는 callable 함수이고, 또 다른 callable 함수인 hello_decorator 의 상단에 위치하여 코드를 추가해주고, 그것의 wrapper 함수를 리런한다.

Decorator can modify the behavior

# 데코레이터를 선언한다. 
def hello_decorator(func): 
  
    # inner1은 func 인자를 호출하는 Wrapper 함수이다.
    def inner1(): 
        print("Hello, this is before function execution") 
  
        # wrapper 함수의 내부에서 실제 함수를 호출한다. 
        func() 
  
        print("This is after function execution") 
          
    return inner1 
  
  
# wrapper 함수에서 호출될 함수를 선언한다.
def function_to_be_used(): 
    print("This is inside the function !!") 
  
  
# 'function_to_be_used' 함수를 그 기능을 확장하기 위해 데코레이터에 인자로 넘겨준다.
function_to_be_used = hello_decorator(function_to_be_used) 
  
  
# 함수를 호출한다.
function_to_be_used() 

결과

Hello, this is before function execution
This is inside the function !!
This is after function execution

"function_to_be_used"가 어떻게 호출되었지는 그 단계를 살펴보자

데코레이터를 사용하는 함수의 실행 시간을 확인하기 위한 다른 예제를 살펴보자.

# importing libraries 
import time 
import math 
  
# 인자로 들어온 함수의 실행시간을 계산하는 데코레이터
def calculate_time(func): 
     
    # 함수가 인자를 받는다면 다음과 같이 파라미터를 써준다.
    def inner1(*args, **kwargs): 
  
        # 함수가 실행되기 전에 시간을 체크한다.
        begin = time.time() 
          
        func(*args, **kwargs) 
  
        # 함수가 실행된 후 시간을 체크한다.
        end = time.time() 
        print("Total time taken in : ", func.__name__, end - begin) 
  
    return inner1 
  
  
# 어떠한 함수도 시간 측정이 가능해졌다.
@calculate_time
def factorial(num): 
  
    # 2초간 sleep을 걸어준다.
    # 이렇게 하면 실제 차이를 볼 수 있다.
    time.sleep(2) 
    print(math.factorial(num)) 
  
# 함수를 호출한다.
factorial(10)

결과

3628800
Total time taken in :  factorial 2.0061802864074707

What if a function returns something ...

위의 모든 예제의 함수들은 아무것도 리턴하지 않았다. 리턴값이 있을 때의 예제를 살펴본다.

def hello_decorator(func): 
    def inner1(*args, **kwargs): 
          
        print("before Execution") 
          
        # 리턴된 값을 받는다.
        returned_value = func(*args, **kwargs) 
        print("after Execution") 
          
        # 그 값을 다시 리턴한다.
        return returned_value 
          
    return inner1 
  
  
# 함수에 데코레이터를 붙인다.
@hello_decorator
def sum_two_numbers(a, b): 
    print("Inside the function") 
    return a + b 
  
a, b = 1, 2
  
# 리턴값을 받는다.
print("Sum =", sum_two_numbers(a, b)) 

결과

before Execution
Inside the function
after Execution
Sum = 3
profile
폐쇄맨
post-custom-banner

0개의 댓글