데코레이터는 프로그램 개발에서 자주 사용되는 함수이자 파이썬 언어 개발의 기본 지식이기도 하다. 프로그램에서 데코레이터를 합리적으로 사용할 수 있다면 개발 효율성을 높일 수 있을 뿐만 아니라, 또한 작성한 코드를 더욱 정교하게 만들 수도 있습니다. ^_^
데코레이터를 사용할 수 있는 곳은 많습니다. 간단한 예는 다음 시나리오입니다
로그 소개
함수 실행 시간 통계
함수 실행 전 준비 처리
기능 실행 후 정리 기능
권한 확인 및 기타 시나리오
캐시
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 중국어 웹사이트로!