반응형
파이썬 데코레이터
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
728x90
반응형
'Python' 카테고리의 다른 글
[Python] scheduler 사용하기 #APScheduler (2) | 2020.09.04 |
---|---|
Python Decorator 파라메터 사용하기 #decorator parameter (3) | 2020.09.03 |
[pyQT5] pyQT Button. 버튼 클릭 이벤트 #pyQT Button (0) | 2020.08.15 |
[pyQT5] pyQT 창띄우기 위치설정. Center 로 띄우기. (0) | 2020.08.15 |
[pyQT5] pyQT install. pip 로 설치하기 (0) | 2020.08.15 |
댓글