본문 바로가기
Language/Python

[Python] Decorator

by 별토끼. 2017. 8. 16.
반응형

[Python] Decorator 


  • Decorator

 - Decorator : 기존 코드에 여러 기능을 덧댈 수 있는 함수

 - annotation을 이용하여 사용한다.

 - def 함수명(func):

def wrapper(): 

   의 형태를 갖추고 있다.

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
#-*- coding: utf-8 -*-
'''
    - decorator 학습하기
'''
def helloBye(func):
    def wrapper():
        print "hello"
        # helloBye 의 인자로 전달된 함수를 호출
        func()
        print "bye"
    return wrapper
 
@helloBye
def f1():
    print u"f1() 함수를 수행했습니다."
   
def f2():
    print u"f2() 함수를 수행했습니다."
@helloBye        
def f3():
    print u"f3() 함수를 수행했습니다."    
    
if __name__ == '__main__':
    f1()
    print "------"
    f2()
    print "------"
    f3()
cs



  • Decorator2 
 - tuple type
    1. list type 과 유사
    2. 읽기 전용 (저장된 데이터 수정, 삭제 불가)
    3. list 에 비해 속도가 빠르다
 - dict type
    1. key : value 형태로 데이터를 저장한다.
    2. 순서가 없는 데이터이다.
    3. key 값을 이용해서 저장된 값을 참조한다.


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
#-*- coding: utf-8 -*-
 
# tuple 타입 = args / # dict 타입 = kwargs
# 어떤 인자의 형태도 받아줄 수 있는 함수
def test(*args, **kwargs):
    print args
    print kwargs
    print "--- test() ---"
 
def auth(func):
    def wrapper(*args, **kwargs):
        # decorator 가 적용된 함수에 전달된 인자를 얻어올 수 있다.
        print args, kwargs
        # kwargs 는 dict type 이므로 kwargs["key"] 형태로 참조
        print kwargs["name"], " auth !"
        func(*args, **kwargs)
        print kwargs["name"], " Success !"
    return wrapper
 
@auth
def updateUser(name):
    print name,u"업데이트 합니다."
@auth
def deleteUser(name):
    print name,u"삭제합니다"
 
if __name__ == '__main__':
 
    test(1)
    test(1,2)
    test("a","b","c")
    test(name="gura")
    test(isMan=True)
    test(name="monkey",isMan=False)
    test("a","b",name="cat",isMan=True)
 
    #updateUser(name="gura")
    #deleteUser(name="monkey")
cs



  • class로 정의한 Decorator


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
#-*- coding: utf-8 -*-
'''
    - decorator 를 class 로 정의하면 더 깔끔해진다.
'''
from symbol import decorator
# decorator 역할을 할 class 정의하기
class HelloBye:
    #생성자
    def __init__(self,f):
        # 인자로 전달된 함수를 func 라는 필드에 저장하기
        self.func=f
    #객체를 call 했을 때 호출되는 메소드
    def __call__(self, *args, **kwargs):
        print "hello"
        self.func(*args, **kwargs)
        
        #멤버 메소드 호출하기
        self.sing()
        self.dance()
        print "bye!"
 
    def sing(self):
        print u"노래를 불러요"
        
    def dance(self):
        print u"춤을 춰요"
@HelloBye
def test1():
    print "test1() called"
 
if __name__ == '__main__':
    test1()
cs



  • import를 통한 Decorator


1
2
3
4
5
6
7
8
9
10
11
12
13
#-*- coding: utf-8 -*-
from deco.myDeco import HelloBye, Auth
 
 
@HelloBye
def test1():
    print "test1() called"
@Auth
def test2():
    print "test2() called"
if __name__ == '__main__':
    test1()
    test2()
cs


반응형

'Language > Python' 카테고리의 다른 글

0710 Python 문법, 우분투 사용법  (0) 2019.07.10
[Python] Except / File  (0) 2017.08.17
[Python] Extends / super  (0) 2017.08.16
[Python] Main / class / 생성자 / return  (1) 2017.08.16
[Python] 정규표현식(Regulation Express) / input  (0) 2017.08.16

댓글