파 이 썬 학습 노트-decorator

2037 단어 Python 학습
학습 참고 자료:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819879946007bbf6ad052463ab18034f0254bf355000
소결:1.함수 호출 전후'begin call''end call'로 그 를 출력 할 수 있 는 decorator 를 작성 하 십시오.
import functools def log(f):     @functools.wraps(f)     def wrapper(*args,**kw):         print 'begin call'         return f(*args,**kw)     print 'end call'     return wrapper @log def f():     print 'Function is processing'
결과:시작 하기 전에 begin call 을 인쇄 하지만 끝 난 후에 end call 은 없습니다.분석 원인:return f(*args,*kw)문 구 를 인쇄 할 때 대응 하 는 f 함수 가 되 돌 아 왔 고,'end call'은 로그(f)를 처음(초기 화 할 때)에 만 실 행 됐 으 며,매번 f()를 호출 할 때마다 이 문 구 를 실행 하지 않 았 습 니 다.해결 방법 을 잠시 찾 지 못 했다.
----------------------------------------------------------------------------------------------------------------------------------------
해결책 을 찾 았 다  문장 return f(*args,**kw)는 실제 적 으로 f()를 먼저 연산 한 다음 에 얻 은 값 을 되 돌려 주기 때문에 쓰기 만 하면 된다.
val = f(*args,**kw)
print 'end call'
return val
하면 돼!
----------------------------------------------------------------------------------------------------------------------------------------
2.@log의 decorator 를 써 서 지원 할 수 있 습 니까?@log def f(): pass 또 지원:@log('execute') def f(): passimport functools def log(text):     if type(text) == str:         def decorator(f):             @functools.wraps(f)             def wrapper(*args,**kw):                 print '%s "%s"'%(f.__name__,text)                 return f(*args,**kw)             return wrapper         return decorator     else:         f = text         @functools.wraps(f)         def wrapper(*args,**kw):             print '%s'%(f.__name__)             return f(*args,**kw)         return wrapper
좀 복잡 하 게 써 서 더 간소화 할 수 있 을 지 생각 나 지 않 았 다.매개 변 수 를 입력 한 후 먼저 실제 인삼 유형 을 판단 하여 log(f)인지 log('execute')(f)인지 구별 하여 3 층 끼 워 넣 는 지 2 층 끼 워 넣 는 장식 기 인지 확인 합 니 다.

좋은 웹페이지 즐겨찾기