파이썬 데코레이터는 무엇을 의미합니까? 파이썬 데코레이터를 사용하는 방법은 무엇입니까?

PHP中文网
풀어 주다: 2017-06-20 14:30:51
원래의
1880명이 탐색했습니다.

Python---데코레이터에 대한 자세한 설명

정의:

은 본질적으로 함수입니다. 그 기능은 또 다른 기능(즉, 장식된 기능)을 장식하고 장식된 기능에 기능을 추가하는 것입니다. 데코레이팅된 함수의 소스 코드와 호출 방법은 변경할 수 없다는 것이 전제입니다. 이런 함수를 데코레이터(Decorator)라고 합니다.

분석:

아래에서 많은 말을 하지 말고 코드를 사용하여 설명하세요. 아래는 함수입니다.

      b=1+2
로그인 후 복사

프로그램 출력:

————————

3

————————

이제 이 함수에 설명을 추가하고 싶습니다. , 다음과 같이 데코레이터를 작성할 수 있습니다:

 1 #原函数 2 def add(): 3     a=1+2 4     print(a)  
 5 #装饰器 6 def decorator(func): 7     def warpper(): 8         print("1+2的结果是:") 9         func()10     return warpper11 #注意此句   12 add=decorator(add)13 #调用函数14 add()
로그인 후 복사

프로그램 출력:

——————————

1+2의 결과는 다음과 같습니다:

3

————— — ————

이렇게 해서 우리는 성공적으로 목표를 달성했습니다. 12행의 이 문장에 주목하세요. 이 문장은 add 함수 개체를 decorator() 함수에 전달하고 새 함수 변수를 반환하므로 이 새 함수 개체는 변경되지 않도록 보장됩니다. 데코레이팅된 함수의 호출 방법은 변경되지 않습니다. Python 구문의 12행에 있는 명령문을 대체하는 더 우아한 방법이 있습니다. 다음과 같습니다:

 1  #装饰器 2 def decorator(func): 3     def warpper(): 4         print("1+2的结果是:") 5         func() 6     return warpper 7  8 #add=decorator(add) 9 #原函数10 @decorator#换成@符号11 def add():12     a=1+213     print(a)14 #调用函数15 add()
로그인 후 복사

데코레이팅된 함수 바로 앞에 "@xxx"를 추가합니다. (xxx는 데코레이터 함수의 이름입니다.)

데코레이팅된 함수가 매개변수가 있나요?

장식된 함수에 매개변수가 있으면 어떻게 되나요? 우리는 어떻게 일해야 할까요? 걱정하지 마세요. 무한 매개변수 형태로 매개변수를 수집할 수 있습니다. 예제 코드는 다음과 같습니다.

 1 def decorator(func): 2     def warpper(*args,**kwargs): 3         print("相加的结果是:") 4         func(*args,**kwargs) 5     return warpper 6  7 @decorator 8 def add(x,y): 9     a=x+y10     print(a)11 12 add(2,3)
로그인 후 복사
程序输出:
——————————————————
相加的结果是:
5
——————————————————
로그인 후 복사

아래에 페이지 확인 데코레이터를 작성하세요.

일부 웹사이트의 일부 페이지는 사용자가 로그인해야 액세스할 수 있다는 것을 누구나 알고 있습니다. 예를 들어 다음 세 가지 기능(각각 세 페이지를 나타냄):

1 def index():2     print("welcome to the index page")3 def home():4     print("welcome to the home page")5 def bbs():6     print("welcome to the bbs page")7     return "I am the return contents"
로그인 후 복사

이제 홈 페이지를 추가하고 bbs 페이지를 확인해 보니 현재 소스 코드를 변경하는 것이 불가능하다는 것이 분명합니다. 이때 다음과 같이 데코레이터를 사용할 수 있습니다.

 1 username,passwd="jack","abc123"#模拟一个已登录用户 2 def decorator(func): 3     def warpper(*args,**kwargs): 4         Username=input("Username:").strip() 5         password=input("Password:").strip() 6         if username==Username and passwd==password: 7             print("Authenticate Success!") 8             func(*args,**kwargs) 9         else:10             exit("Username or password is invalid!")11     return warpper12 13 def index():14     print("welcome to the index page")15 @decorator16 def home():17     print("welcome to the home page")18 @decorator19 def bbs():20     print("welcome to the bbs page")21     return "I am the return contents"22 23 index()24 home()25 bbs()
로그인 후 복사

프로그램 결과:

————————

welcome to the index page   #인덱스 인증 없이 바로 로그인 가능 페이지
사용자 이름:jack
비밀번호: abc123
인증 성공!
————————

위 코드의 마지막 문장(25번째 줄)을 “print(bbs())”로 변경한 후 살펴보면 bbs()에 반환값이 있다는 것을 알 수 있습니다. 그의 출력:

————————

색인 페이지에 오신 것을 환영합니다

사용자 이름:jack

비밀번호:abc123

인증 성공!

홈 페이지에 오신 것을 환영합니다
사용자 이름:jack
비밀번호:abc123
인증 성공!
BBS 페이지에 오신 것을 환영합니다
없음 ~ ? ?


————————
무슨 일이 일어났나요! bbs()의 반환 값은 None으로 인쇄됩니다. 어떻게 그래? 장식된 함수의 소스 코드가 변경되지 않나요? 이 문제는 어떻게 해결될 수 있나요?

분석해 보겠습니다.

bbs 함수를 실행하면 실제로 데코레이터에서 래퍼 함수를 ​​실행하는 것과 동일합니다. 데코레이터를 주의 깊게 분석하면 래퍼 함수에 반환 값이 없음을 알 수 있습니다. 데코레이팅된 함수의 반환을 올바르게 보장할 수 있습니다. 값이 올바르게 반환될 수 있으면 데코레이터를 수정해야 합니다.

1 username,passwd="jack","abc123"#模拟一个已登录用户
 2 def decorator(func): 3     def warpper(*args,**kwargs): 4         Username=input("Username:").strip() 5         password=input("Password:").strip() 6         if username==Username and passwd==password: 7             print("Authenticate Success!") 8            return func(*args,**kwargs)#在这里加一个return就行了
 9         else:10             exit("Username or password is invalid!")11     return warpper12 
13 def index():14     print("welcome to the index page")15 @decorator16 def home():17     print("welcome to the home page")18 @decorator19 def bbs():20     print("welcome to the bbs page")21     return "I am the return contents"22 
23 index()24 home()25 bbs()
로그인 후 복사

如图加上第8行的return就可以解决了。下面我们在看看改后的程序输出:

————————

welcome to the index page
Username:jack
Password:abc123
Authenticate Success!
welcome to the home page
Username:jack
Password:abc123
Authenticate Success!
welcome to the bbs page
I am the return contents   #bbs()的返回值得到了正确的返回

——-——————

好了,返回值的问题解决了.

 

既然装饰器是一个函数,那装饰器可以有参数吗?

答案是肯定的。我们同样可以给装饰器加上参数。比如还是上面的三个页面函数作为例子,我们可以根据不同页面的验证方式来给程序不同的验证,而这个验证方式可以以装饰器的参数传入,这样我们就得在装饰器上在嵌套一层函数 了:

 1 username,passwd="jack","abc123"#模拟一个已登录用户 2 def decorator(auth_type): 3     def out_warpper(func): 4         def warpper(*args,**kwargs): 5             Username=input("Username:").strip() 6             password=input("Password:").strip() 7             if auth_type=="local": 8                 if username==Username and passwd==password: 9                     print("Authenticate Success!")10                     return func(*args,**kwargs)11                 else:12                     exit("Username or password is invalid!")13             elif auth_type=="unlocal":14                 print("HERE IS UNLOCAL AUTHENTICATE WAYS")15         return warpper16     return out_warpper17 18 def index():19     print("welcome to the index page")20 @decorator(auth_type="local")21 def home():22     print("welcome to the home page")23 @decorator(auth_type="unlocal")24 def bbs():25     print("welcome to the bbs page")26     return "I am the return contents"27 28 index()29 home()30 bbs()
로그인 후 복사

 

输出:

————————

welcome to the index page
Username:jack
Password:abc123
Authenticate Success!
welcome to the home page
Username:jack
Password:abc123
HERE IS UNLOCAL AUTHENTICATE WAYS

————————

可见,程序分别加入了第2行和第16行和中间的根据auth_type参数的判断的相关内容后, 就解决上述问题了。对于上面的这一个三层嵌套的相关逻辑,大家可以在 pycharm里头加上断点,逐步调试,便可发现其中的道理。 

总结

要想学好迭代器就必须理解一下三条:

1.函数即变量(即函数对象的概念)

2.函数嵌套

3.函数式编程

위 내용은 파이썬 데코레이터는 무엇을 의미합니까? 파이썬 데코레이터를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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