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으로 인쇄됩니다. 어떻게 그래? 장식된 함수의 소스 코드가 변경되지 않나요? 이 문제는 어떻게 해결될 수 있나요?
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!