언어/Python

파이썬(Python) - 데코레이터 (Decorator) 패턴 사용 예제 및 소스코드

2018. 12. 10. 19:07
목차
  1. 파이썬(Python) - 데코레이터(Decorator) 예제 문법(Syntax)


파이썬(Python) - 데코레이터(Decorator)



오늘은 지난 시간에 이어서 파이썬 데코레이터(Decorator) 패턴 및 wraps 사용 예제를 작성해보고
소스코드를 설명드리겠습니다.

데코레이터에 대한 정의는 특정 함수를 랩핑(wrapping) 후 추가적으로 기능을 추가하고 새로운
함수를 작성하는 역할이라고 볼 수 있습니다.

즉, 공통으로 항상 호출 되는 함수를 작성하거나, 특정 함수의 전/후에 실행가능한 기능을 추가하는 것
이라고 볼 수 있습니다.

데코레이터의 사용은 최대한 파이썬 문법(Pythonic)에 가깝게 작성 하고 공통적으로 코드를 쉽게 관리
및 가독성이 좋은 코드를 작성하기 위해서 사용합니다.


그러면 문서 하단에서 간단하게 예제를 작성해보겠습니다.

파이썬(Python) - 데코레이터(Decorator) 예제 문법(Syntax)


파이썬 데코레이터를 활용하면 실제로 소스 코드 실행 중에 다양한 기능을 수행 할 수 있고 직관적으로
가독성을 높여주는 효과가 있다고 볼 수 있습니다.

다만, 잦은 데코레이터의 사용은 코드를 난해하게 만들고 디버깅을 어렵게 하는 가능성이 있으니
본연의 기능에 맞는 위치에 사용하시는 게 좋을 것 같습니다.

아래 예제에서는 특히 wraps를 사용/미사용 의 경우에 대해서 정확하게 이해하셔야 합니다. 

python_decorator1.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from functools import wraps
#파이썬 데코레이터 예제
#wraps 사용 : 기존 정의한 함수 내 속성 유지
#wraps 미사용 : 기존 정의한 함수 내 속성 유지 하지 않음
#용도 : 특정 시점에 항상 실행되는 함수 정의 -> 로그, 통계성 데이터, 성능 테스트 등
 
def my_decorator1(func):
    def runs_func():
        print("decorator1 - no use wrapper")
        func()
    return runs_func
 
def my_decorator2(func):
    @wraps(func)
    def runs_func():
        print("decorator2 - use wrapper")
        func()
    return runs_func
 
@my_decorator1
def my_func1():
    '''
    func attr text1
    '''
    print("my_func1 run!")
 
@my_decorator2
def my_func2():
    '''
    func attr text2
    '''
    print("my_func2 run!")
 
 
#데코레이터 사용 함수 실행(wraps 미사용)
my_func1()
print("Func1 Name : ", my_func1.__name__)
print("Func1 Doc : ",  my_func1.__doc__)
 
#구분선
print('-' * 50)
 
#데코레이터 사용 함수 실행(wraps 사용)
my_func2()
print("Func2 Name : ", my_func2.__name__)
print("Func1 Doc : ",  my_func2.__doc__)
 
##### 참고 자료 #####
 
#데코레이터 미사용 함수 실행(wraps 미사용)
deco_my_func1 = my_decorator1(my_func1)
deco_my_func1()
 
#구분선
print('-' * 50)
 
#데코레이터 미사용 함수 실행(wraps 사용)
deco_my_func2 = my_decorator1(my_func2)
deco_my_func2()
Colored by Color Scripter
cs

- 1번 라인 : wraps 함수 import

  wraps를 사용하지 않으면 외부에서 전달된 함수의 인자를 포함하고 있지 않습니다.
  보통 클로저(Closure) : 내부(Inner)함수에서 외부(Outer)로 부터 전달 된 인자를 저장하는 개념에 대한
  이해가 필요합니다.

- 7번 라인 :  my_decorator1 함수 정의 : wraps 미사용

- 13번 라인 : my_decorator2 함수 정의 : wraps 사용

- 21, 28번 라인 : 데코레이터 실행 함수 정의(my_func1, my_func2)

  my_func2() 실행의 경우 wraps 기능을 추가했으므로, 지역 스코프내에 인자(args)를 전부 출력

- 51, 58번 라인 : 데코레이터를 사용하지 않고 함수를 선언해서 사용하는 패턴




파이썬(Python)
- 데코레이터(Decorator) 예제 실행 화면


아래 이미지로 실제 실행 화면을 확인하실 수 있습니다.


실제 실행 화면




마무리


이번 예제에서는 파이썬에서 자주 사용하는 데코레이터 패턴에 대해서 설명드렸습니다.

적절한 데코레이터 패턴의 사용은 파이썬 문법다운 코드 스타일을 유지 가능하게 하고 공통 실행 함수
작성을 통한 전체에서 실행되는 모듈 기능 구현을 손 쉽게 할 수 있도록 지원합니다.

보통은 로깅(Logging), 공통데이터 처리, 테스트(Test Case)기능 작성 등에 사용되고 있습니다.

다음 시간에도 파이썬 관련 유용한 주제에 대해서 포스팅 하도록 하겠습니다.

소스코드 다운로드 :  python_decorator1.zip


저작자표시 동일조건 (새창열림)

'언어 > Python' 카테고리의 다른 글

파이썬 아나콘다(Anaconda) - 심화 사용법 정리(2) - env 명령어  (2) 2019.01.26
파이썬 아나콘다(Anaconda) - 심화 사용법 정리(1) - list, search 명령어  (0) 2019.01.23
파이썬(Python) - 람다(lambda)식 및 filter, reduce 사용 예제 및 소스코드  (0) 2018.11.15
파이썬(Python) - 람다(lambda)식 및 map 사용 예제 및 소스코드  (0) 2018.10.31
파이썬(Python) - 정규표현식(Regex) 특수문자 제거 설명 및 예제 소스 코드  (3) 2018.07.20
  1. 파이썬(Python) - 데코레이터(Decorator) 예제 문법(Syntax)
'언어/Python' 카테고리의 다른 글
  • 파이썬 아나콘다(Anaconda) - 심화 사용법 정리(2) - env 명령어
  • 파이썬 아나콘다(Anaconda) - 심화 사용법 정리(1) - list, search 명령어
  • 파이썬(Python) - 람다(lambda)식 및 filter, reduce 사용 예제 및 소스코드
  • 파이썬(Python) - 람다(lambda)식 및 map 사용 예제 및 소스코드
[좋은사람]
[좋은사람]
좋은사람의 개발 노트 입니다.
[좋은사람]
좋은사람의 개발 노트
[좋은사람]
전체
오늘
어제
  • 전체보기 (189)
    • 언어 (68)
      • Java (12)
      • Python (39)
      • C# (5)
      • PHP (4)
      • Go (8)
    • OS (18)
      • Linux (7)
      • Windows 10 (5)
      • Etc (6)
    • 빅데이터 & 분석 (8)
      • R (0)
      • Machine Learning (8)
    • 네트워크 (4)
      • Etc (4)
    • 웹 프론트 (25)
      • Javascript & ECMA (8)
      • Vue (13)
      • React (4)
    • 웹 백엔드 (15)
      • Spring (3)
      • Django & Flask (7)
      • Npm & Express (5)
    • 개발도구 (18)
      • Jetbrains (3)
      • Eclipse (5)
      • Git (4)
      • Atom & VScode (6)
    • 데이터베이스 (7)
      • Oracle (2)
      • MariaDB & MySQL (2)
      • Etc (3)
    • 모바일 (6)
      • Android (3)
      • Hybrid (3)
    • 라이프 (20)
      • 여행 & 일상 (6)
      • 취미 (14)

블로그 메뉴

  • 홈으로
  • 블로그소개
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 코딩 면접
  • 머신러닝
  • 윈도우10
  • windows10
  • javascript
  • flask
  • CFW
  • 미뮤
  • react
  • centos
  • Linux
  • 디자인패턴
  • python
  • Thread
  • Database
  • 리액트
  • ubuntu
  • go
  • Java
  • Algorithm
  • php
  • npm
  • ps4
  • 커펌
  • Anaconda
  • 3DS
  • SpringSTS
  • 이클립스
  • OCR
  • Django
  • ATOM
  • 2DS
  • 인텔리j
  • 아톰 에디터
  • Git
  • C#
  • 개발자 면접
  • Eclipse
  • nodejs
  • vue.js

최근 댓글

최근 글

hELLO · Designed By 정상우.
[좋은사람]
파이썬(Python) - 데코레이터 (Decorator) 패턴 사용 예제 및 소스코드
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.