> 백엔드 개발 > 파이썬 튜토리얼 > Python에서 여러 데코레이터의 호출 순서

Python에서 여러 데코레이터의 호출 순서

高洛峰
풀어 주다: 2017-02-17 11:01:19
원래의
1141명이 탐색했습니다.

머리말

데코레이터는 프로그램 개발에서 자주 사용되는 함수이자 파이썬 언어 개발의 기본 지식이기도 하다. 프로그램에서 데코레이터를 합리적으로 사용할 수 있다면 개발 효율성을 높일 수 있을 뿐만 아니라, 또한 작성한 코드를 더욱 정교하게 만들 수도 있습니다. ^_^

사용 시나리오

데코레이터를 사용할 수 있는 곳은 많습니다. 간단한 예는 다음 시나리오입니다

  • 로그 소개

  • 함수 실행 시간 통계

  • 함수 실행 전 준비 처리

  • 기능 실행 후 정리 기능

  • 권한 확인 및 기타 시나리오

  • 캐시

데코레이터 사례

def user_login(fun):
    def islogin(request,*args,**kwargs):
        context = {}
        if request.session.has_key('uname'):
            context['uname'] = request.session.get('uname')
        else:
            context['uname'] = 'None'
        return fun(request,context,*args,**kwargs)
    return islogin
로그인 후 복사

@user_login
def ucOrder(request,context,pIndex):
    '''
    获取数据
    处理数据
    传递到页面上去
로그인 후 복사

위는 간단한 전자상거래 애플리케이션에서 데코레이터를 사용한 사례로, 사용자가 로그인해야만 ucOrder 기능을 실행할 수 있다. 데코레이터를 사용하지 않는 경우 일반적인 접근 방식은 ucOrder에 여러 개의 확인 코드를 작성하여 사용자가 로그인했는지 확인한 다음 후속 실행 로직을 결정하는 것일 수 있으며 이는 더 번거롭습니다.

그럼 데코레이터를 사용하고 나면 상대적으로 간단해집니다. 데코레이터의 형식에 따라 ucOrder 함수에 @user_login만 추가하면 됩니다. 그러면 Python 인터프리터가 실행될 때 위에서부터 설명합니다. 하단의 코드는 먼저 user_login 함수를 실행한 후 user_login(ucOrder)과 동일한 user_login 함수의 매개변수로 ucOrder를 전달하여 사용자의 로그인 여부를 확인하고 ucOrder 실행 여부를 결정합니다. function

여러 데코레이터가 사용하는 호출 순서

def one(func):
    print('----1----')
    def two():
        print('----2----')
        func()
    return two

def a(func):
    print('----a----')
    def b():
        print('----b----')
        func()
    return b

@one
@a
def demo():
    print('----3----')

demo()
로그인 후 복사

실행 결과 :

/usr/bin/python2.7 /home/python/Desktop/tornadoProject/one.py
----a----
----1----
----2----
----b----
----3----
로그인 후 복사

실행 결과를 보면 알 수 있듯이 여러 데코레이터를 사용하는 경우 실행 순서는 다음과 같습니다. 아직도 좀 이상해요, 왜 이런 일이 일어나는 걸까요?

이 문제에 대해 더 잘 설명할 수 있는 기사가 있습니다. Python 데코레이터 실행 순서 신화


더 많은 Python 다중 데코레이터 호출 순서 관련 기사에 관심을 가져주세요. PHP 중국어 웹사이트로!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿