Python3 관련

[Python3] 파이썬 데코레이터, @ 의미, @ 사용법

녕집사 2022. 7. 31. 23:20
반응형

파이썬을 사용하거나 github 같은 곳에서 코드를 보면 함수 위에 @표시가 되어 있는 것을 볼 수 있습니다.

@ 사용된 예시 코드

항상 볼 때마다 어떤 기능을 하는 코드인지 유심히 살펴보지 않고 넘어가는 경우가 많았을 것입니다.

오늘은 이에 대해 간단하게 설명하고자 합니다.

 

@사용함수

 

이러한 형식으로 사용하는 것 처럼 보여서 간단하게 보일 수 있지만 생각보다 간단하게 사용할 수 있는 기술은 아닙니다.

많은 연습을 통해서 사용법을 익혀야 효율적으로 사용할 수 있습니다.

 

클래스 내에서 직접적으로 접근할 수 있는 데코레이터형식의 정적메소드는 다음의 2가지가 있습니다.

 

@classmethod
@staticmethod

staticmethod는 일반적인 인스턴스 메소드의 self를 활용한 변수를 사용하지 않는 독립적인 함수라고 생각하면 편합니다.

classmethod는 self 대신 cls(혹은 다른 이름의 변수 지정 가능)라는 클래스를 지칭하는 파라미터를 전달 받습니다.

class ADD_CLASS:
    a = 0
    b = 0
    def __init__(self, val1, val2):
        ADD_CLASS.a += val1
        ADD_CLASS.b += val2

    @classmethod
    def add_two_val_cm(cls):
        return cls.a + cls.b

    @staticmethod
    def add_two_val_sm(x, y):
        return x + y

test = ADD_CLASS(2,3)
print(test.add_two_val_cm())
print(test.add_two_val_sm(4, 5))

 

코드를 통해 예시를 살펴보도록 하죠. 

classmethod를 통해서 인스턴스를 생성하게 되면 클래스 내부의 변수를 엑세스하여 사용할 수 있습니다. 

하지만 staticmethod는 클래스 내부의 변수를 엑세스할 수 없고 선언하는 방식도 일반적인 클래스가 없는 함수 선언 방식과 동일한 방식으로 선언할 수 있습니다.

 

class에 종속적인 함수를 생성하고 싶다면 classmethod를 class에 독립적인 함수를 생성하고 싶다면 staticmethod를 사용하면 된다고 생각하면 될 것 같습니다.


여기까지는 기본적으로 파이썬에서 제공되는 데코레이터 메소드를 알아봤습니다.

이제 직접 데코레이터 함수를 선언하여 생성해보도록 하겠습니다.

import time
import datetime

def timeCheck_func(func):
    def wrapper():
        start_time = time.time()
        print(func.__name__,'함수 시작 시간: {}'.format(datetime.datetime.now()))
        func()
        end_time = time.time()
        print(func.__name__,'함수 종료 시간: {}'.format(datetime.datetime.now()))
        print(func.__name__, '함수 소요 시간: {}'.format(end_time - start_time))
    return wrapper

@timeCheck_func
def timetest_func():
    for i in range(10):
        time.sleep(1)
        
timeCheck_func()

 

위와 같이 timeCheck_func라는 함수의 실제 수행 시간을 체크해주는 데코레이터를 만들어 봤습니다.

timetest_func를 통해서 대략 10초를 time.sleep()으로 지연시키고 실행한 결과

대략 10초의 시간이 소요되었다고 출력이 되는 모습을 볼 수 있습니다.

 

일반적인 상황이었다면 시간을 체크하는 구문을 매 함수마다 시작과 끝에 삽입했을 가능성이 큽니다.

 

하지만 코드의 간결성 및 가독성을 높이기 위해서 위와 같이 데코레이터를 사용하여 간단하게 @ 만으로도 코드의 양을 줄이고 보기 좋게 코드를 짤 수 있게 되었습니다.

 

이러한 기능이 데코레이터의 장점이라고 할 수 있습니다.

 

이외에도 다양하게 변형하여 적용한다면 폭 넓게 활용이 가능할 것이라고 생각합니다.

 

데코레이터 기능을 처음 사용해보시는 분들은 한 번 다른 형태의 데코레이터를 만들어 보고 연습해보시기 바랍니다.

 

반응형