Python 장식 기 원리,정의 및 용법 상세 설명

5007 단어 Python장식 기
본 논문 의 사례 는 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 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기