Python 장식 기 원리,정의 및 용법 상세 설명
파 이 썬 장식 기
장식 기
1.함수 에서 함수 정의
함수 에서 다른 함 수 를 정의 합 니 다.즉,끼 워 넣 은 함 수 를 만 들 수 있 습 니 다.예 는 다음 과 같 습 니 다.
def sayHi(name="hjj2"):
print 'inside sayHi() func'
def greet():
return 'inside greet() func'
print(greet())
sayHi()
#output
# inside sayHi() func
# inside greet() func
2.함 수 를 매개 변수 로 다른 함수 에 전달 하고 장식 기 원형
def sayHi():
return 'hi hjj2'
def doSthBeforeSayHi(func):
print 'before sayHi func'
print(func())
doSthBeforeSayHi(sayHi)
#output
# before sayHi func
# hi hjj2
3.하나의 장식 기 구현두 번 째 단계 에서 우 리 는 장식 기의 원 리 를 기본적으로 탐구 했다.python 장식 기 가 하 는 일 은 함 수 를 봉인 하고 이런 저런 방식 으로 그의 행 위 를 수정 하 는 것 이다.@이 없 는 초보적인 예 는 다음 과 같다.
def new_decorator(func):
def wrapDecorator():
print 'before func'
func()
print 'after func'
return wrapDecorator
def func_require_decorator():
print 'a func need decorator'
func_require_decorator()
#ouput: a func need decorator
func_require_decorator = new_decorator(func_require_decorator)
func_require_decorator()
#ouput:
# before func
# a func need decorator
# after func
@을 사용 하여 장식 기 를 실행 합 니 다.
@new_decorator
func_require_decorator()
#ouput:
# before func
# a func need decorator
# after func
여기 서 우 리 는 이 두 사례 의 운행 결과 가 같다 는 것 을 볼 수 있다.그래서 우 리 는@new 를 상상 할 수 있다.decorator 의 역할 은 바로...
func_require_decorator = new_decorator(func_require_decorator)
우 리 는 이 장식 기 를 계속 최적화 시 켰 다.지금 우리 가 통과 하려 면print(func_require_decorator.__name__)
잘못 보고 할 것 이다.그러면 python 이 제공 한functools.wraps
을 통 해 해결 해 야 합 니 다.@wraps 는 함 수 를 받 아들 여 장식 하고 함수 이름,주석 문서,매개 변수 목록 등 을 복사 하 는 기능 을 추가 합 니 다.이것 은 장식 기 안에서 장식 전의 함수 속성 에 접근 할 수 있 습 니 다.
from functools import wraps
def new_decorator(func):
@wraps(func)
def wrapDecorator():
print 'before func'
func()
print 'after func'
return wrapDecorator
def func_require_decorator():
print 'a func need decorator'
@new_decorator
func_require_decorator()
print(func_require_decorator.__name__)
#ouput: func_require_decorator
2.사용 장면1.권한 수여,대체 예
from functools import wraps
def requires_auth(f):
@wraps(f)
def decorated(*args, **kwargs):
auth = request.authorization
if not auth or not check_auth(auth.username, auth.password):
authenticate()
return f(*args, **kwargs)
return decorated
2.로그:
from functools import wraps
def logit(logfile='out.log'):
def logging_decorator(func):
@wraps(func)
def wrapped_function(*args,**kwargs):
log_string = func.__name__+"was called"
print(log_string)
with open(logfile,'a') as opened_file:
opened_file.write(log_string+'
')
return func(*args,**kwargs)
return wrapped_function
return logging_decorator
@logit()
def func1():
pass
func1()
3.기타 flask 의@app.route()장식
1.위의 로그 장식 기 를 클래스 로 바 꾸 는 초기 모델 은 다음 과 같 습 니 다.
from functools import wraps
class logit(object):
def __init__(self, logfile='out.log'):
self.logfile = logfile
def __call__(self, func):
@wraps(func)
def wrapped_function(*args, **kwargs):
log_string = func.__name__ + "was called"
print(log_string)
# logfile
with open(self.logfile, 'a') as open_file:
#
open_file.write(log_string + '
')
#
self.notify()
return func(*args, **kwargs)
return wrapped_function
def notify(self):
pass
@logit()
def myfunc1():
pass
class email_logit(logit):
'''
email
'''
def __init__(self, email='[email protected]', *args, **kwargs):
self.email = email
super(email_logit, self).__init__(*args, **kwargs)
def notify(self):
'''
'''
pass
이런 방식 을 통 해 우 리 는 우리 가 자신의 수 요 를 정의 하고 코드 의 번 거 로 움 을 줄 이 며 재 활용 율 을 높 일 수 있다.이로써 장식 기 에 대한 탐색 은 끝났다.
더 많은 파 이 썬 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.