본문 바로가기
Python

Python Decorator 란? 사용 방법. #Python Decorator

by bryan.oh 2020. 9. 3.
반응형

파이썬 데코레이터
Python Decorator

Decorator

실행하려는 method데코레이터는 사용자가 구조를 수정하지 않고 기존 객체에 새로운 기능을 추가 할 수 있도록하는 Python의 디자인 패턴입니다. 

데코레이터는 일반적으로 데코 레이트하려는 함수의 정의 전에 호출됩니다

.

.

.

개발자는 코드로 이해하는겁니다 ㅎㅎ

 

간단한 예제

def decorator(func):
    def wrapper(*args, **kwargs):
        print('Hello~')	# 전처리
        print(func(*args, **kwargs))
        print('GoodBye~')	# 후처리
    return wrapper

@decorator
def myFunc():
    return 'What is your name?'

위 코드의 myFunc() 실행 결과는

Hello~
What is your name?
GoodBye~

소스에 주석친걸 보셨다면 대략 이걸 왜 쓰는지 아실겁니다.

참고로 메소드명이 decorator 라고 할 필요는 없습니다.
def aabbcc(func): 라고 하면 @aabbcc 로 데코레이터를 선언할 수 있습니다.
또 여러개의 decorator를 사용할 수 있습니다.

 

 

전처리, 후처리??

이것도 예를들면.

관리자 페이지의 REST api  서버 소스를 개발한다면

서버에서 insertUser, deleteUser, updateUser 라는 메소드가 있다고 했을 때 모두 다 

1. (전처리) 권한체크(세션으로 로그인체크같은..)

2. (본 로직) 요청에 대한 처리

3. (후처리) 로그나 오류등등 작업이있다면,

대략 이러한 순서로 처리하겠죠?

def insertUser(arg):
    if checkLogin():

        # do something..

    log()

def deleteUser(arg):
    if checkLogin():

        # do something..

    log()
    
def updateUser(arg):
    if checkLogin():

        # do something..

    log()
.
.
.


같은 작업이 전, 후로 반복됩니다.

이걸 데코레이터로 한다면,

def decorator(func):
    def wrapper(*args, **kwargs):
        if checkLogin():
            func(*args, **kwargs)
        log()
    return wrapper
    
@decorator
def insertUser(arg):
    # do something..

@decorator
def deleteUser(arg):
    # do something..

@decorator
def updateUser(arg):
    # do something..
.
.
.


 이렇게 나오겠죠.

 

왜 쓰나요?

성능상 나아지는건 없습니다.

시스템이 커질수록 관리하기 편하고, 런타임에 validation 하기 좋고 (로깅을 한다면),

소스코드 또한 주요 로직만 보니까 가독성이 좋아지겠죠.

TMI : 그리고 제가 decorator 를 사용하는 가장 중요한 이유는, 있어보이기 때문입니다. 개발자 만족

 

그냥 알아두기

@methodName 을 사용하지 않아도 데코레이터 사용할 수 있습니다.

def iam_deco(func):
    def inner():
        print("Hello~")
        func()
    return inner

def greet():
    print("bryan~")
    
greet()
# bryan~

deco_greet = iam_deco(greet)
deco_greet()
# hello~
# bryan~

 

데코레이터를 두개 사용하면?

def star(func):
    def inner(*args, **kwargs):
        print("*" * 30)
        func(*args, **kwargs)
        print("*" * 30)
    return inner


def percent(func):
    def inner(*args, **kwargs):
        print("%" * 30)
        func(*args, **kwargs)
        print("%" * 30)
    return inner


@star
@percent
def printer(msg):
    print(msg)


printer("Hello")

결과는

******************************
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Hello
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
******************************

@start 는 @percent 를 데코레이트 하고 @percent 는 printer 를 데코레이트 합니다.

 

 

Decorator 응용 기능 - 파라메터 사용하기

2020/09/03 - [Python] - Python Decorator 파라메터 사용하기 #decorator parameter

 

Python Decorator 파라메터 사용하기 #decorator parameter

Python Decorator Parameter Python Decorator 의 개념은 이전 글에서 보시고 2020/09/03 - [Python] - Python Decorator 란? 사용 방법. #Python Decorator 바로 소스 코드 보시죠. 이번 샘플 소스는 각 메소드..

hello-bryan.tistory.com

 

 

 

 

 

728x90
반응형

댓글