본문 바로가기
데이터분석/Python

[python]파이썬 Decorator 간단히 알아보고 연습하기

by 말랭쓰 2021. 1. 24.
320x100

 

 

 

데코레이터란?

파이썬에서는 데코레이터(Decorator)를 지원한다.

말 그대로 decorate + or 로 장식하는 정도로 생각할 수있다.

데코레이터는 함수(메서드)를 장식하여 특정 추가 기능을 적용하여 구현 할 때 편하게 사용할 수 있다.

 

웹페이지로 예를 들어서 보자면 로그인이 필요한 서비스가 있을 것이고, 로그인 없이도 사용할 수 있는 페이지가 있을 것이다.

이 때 로그인을 확인하는 코드를 매번 작성하는 것이 아니라 기존의 함수에 데코레이터를 추가해준다면 기능을 간결하고 반복없이 효율적으로 구현할 수 있다.

 

데코레이터는 언제 사용할까?

Ex)

예를 들어 아래와 같은 기능을 구현하고자 하는 코드가 있다.

def a():
    code_1
    code_2
    code_3
    
def b():
    code_1
    code_4
    code_3

 

a( )와 b( )에서는 code_1과 code_3 부분이 반복적으로 필요하기 때문에 비효율적이고, 다른 함수에서도 반복되어 필요하다면 따로 함수에서 정의해주는 것이 좋다.

이럴 때 사용할 수 있는 것이 'Decorator'이다.

 

데코레이터를 사용하기 위해 새로운 함수 c를 구현해봅시다.

def c(func):
    def wrapper(*args,**kwargs):
        code_1
        result=func(*args,**kwargs)
        code_3
        return result
    return wrapper
728x90

이렇게 해두고, 아까의 a( ), b( ) 코드를 데코레이터를 사용해서 수정해봅시다.

데코레이터를 사용할 때는 '@' 를 사용해주면 된다.

@c
def a():
    code_2

@c
def b():
    code_4

@c 를 사용해서 c( ) 함수안의 code_1과 code_3은 그대로 사용하면서 필요한 기능(코드)만 사용함을 알 수 있다.

 

코드는 이렇게 작동한다.

@c를 사용하고 a( )를 작성하면, a( )가 c( )의 func로 받아져 a( )가 wrapper( )로 바뀌어 아래의 코드가 실행되는 것이다.

c( )의 code_1이 실행되고 'result=func(*args,**kwargs)'에서 code_2가 실행되고, 이어서 code_3이 실행된다.

 

데코레이터 활용 예시

설명만으로는 받아들이기가 어렵기 때문에 쉬운 예시를 활용해 봅시다.

timer( ) 를 만들어 내가 사용하고자 하는 함수앞에 데코레이터를 이용해주었을 때 함수가 실행되는 시간을 출력하는 코드를 작성해 봅시다.

import time

def timer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        result = func(*args,**kwargs)
        end_time = time.time()
        print("running_time: {}".format(end_time - start_time))
        return result
    return wrapper

이렇게 timer()를 작성해주었으면 앞으로 사용하고자 하는 함수앞에 @timer를 해주면 실행시간(running time)을 출력해줄것이다.

간단하게 코드를 작성해서 running time을 확인해 봅시다.

 

@timer
def test(num1,num2):
    result=0
    for num in range(num1,num2+1):
        result+=num
    return result
test(1,10000)

 

 

 

running_time과 함께 result값이 출력된것을 볼 수 있습니다.

 

이렇게 해서 간단하게 Decorator가 언제 쓰이는지와 함께 예시를 알아보았습니다.

잘못된 부분이나 궁금한 점은 댓글로 알려주세요!

300x250
반응형

댓글