반응형
[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 |
댓글