Heim  >  Artikel  >  Backend-Entwicklung  >  Was bedeutet Python-Dekorator? Wie verwende ich Python-Dekoratoren?

Was bedeutet Python-Dekorator? Wie verwende ich Python-Dekoratoren?

PHP中文网
PHP中文网Original
2017-06-20 14:30:511873Durchsuche

Python---detaillierte Erklärung von Dekoratoren

Definition:

Im Wesentlichen eine Funktion. Seine Funktion besteht darin, eine andere Funktion (d. h. die dekorierte Funktion) zu dekorieren und der dekorierten Funktion Funktionalität hinzuzufügen. Voraussetzung ist, dass der Quellcode und die Aufrufmethode der dekorierten Funktion nicht geändert werden können. Eine solche Funktion wird Dekorator genannt.

Analyse:

Lass uns darüber reden es unten Es gibt nicht viel zu sagen, erklären Sie es einfach im Code. Unten ist eine Funktion.

      b=1+2

Programmausgabe:

————————

3

————————

Jetzt möchte ich dieser Funktion einen erklärenden Satz hinzufügen, wie folgt, wir können einen Dekorator schreiben:

 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()

Programmausgabe:

——————————

Das Ergebnis von 1+2 ist:

3

——————————

Auf diese Weise haben wir unser Ziel erfolgreich erreicht. Beachten Sie diesen Satz in Zeile 12. Dieser Satz übergibt das Funktionsobjekt „add“ an die Funktion „decorator()“ und gibt eine neue Funktionsvariable zum Hinzufügen zurück, sodass garantiert werden kann, dass es sich nicht ändert Die aufrufende Methode der dekorierten Funktion bleibt unverändert. Es gibt eine elegantere Möglichkeit, die Anweisung in Zeile 12 in der Python-Syntax zu ersetzen. Wie folgt:

 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()

Fügen Sie „@xxx“ direkt vor der dekorierten Funktion (xxx) hinzu ist der Name der Dekoratorfunktion) kann

Was soll ich tun, wenn die dekorierte Funktion Parameter hat?

Was ist, wenn die dekorierte Funktion Parameter hat? Wie sollen wir arbeiten? Keine Sorge, wir können Parameter in Form unbestimmter Parameter sammeln. Der Beispielcode lautet wie folgt:

 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
——————————————————

Schreiben Sie unten einen Seitenüberprüfungsdekorator.

Wie wir alle wissen, müssen sich Benutzer bei einigen Seiten einiger Websites anmelden, bevor sie darauf zugreifen können. Zum Beispiel die folgenden drei Funktionen (die jeweils drei Seiten darstellen):

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"

Wenn wir jetzt eine Verifizierung zur Homepage und BBS-Seite hinzufügen möchten, ist es offensichtlich nicht möglich, den Quellcode jetzt zu ändern. Zu diesem Zeitpunkt können wir Dekoratoren wie folgt verwenden:

 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()

Programmergebnisse:

————————

Willkommen auf der Indexseite #Die Indexseite kann direkt ohne Verifizierung angemeldet werden
Benutzername:jack
Passwort:abc123
Erfolg authentifizieren! #Anmeldesituation
Willkommen auf der Startseite
Benutzername: Jack #> oder Benutzernamenfehler.
————————

Wir haben festgestellt, dass bbs() einen Rückgabewert hat, wenn wir den letzten Satz des obigen Codes (Zeile 25) in „print(bbs())“ ändern. " und schauen Sie sich dann seine Ausgabe an:

————————

Willkommen auf der Indexseite

Benutzername:jack

Passwort: abc123
Erfolg authentifizieren !
Willkommen auf der Startseite
Benutzername:jack
Passwort:abc123
Erfolg authentifizieren!
Willkommen auf der BBS-Seite
Keine Ist daraus Keine geworden? ? ?

————————

Was ist passiert! Der Rückgabewert von bbs() wird als None ausgegeben. wie so? Würde dies nicht den Quellcode der dekorierten Funktion ändern? Wie kann das gelöst werden?

Lassen Sie es uns analysieren:

Wenn wir die BBS-Funktion ausführen, entspricht dies tatsächlich der Ausführung der Wrapper-Funktion im Dekorator. Nach sorgfältiger Analyse des Dekorators haben wir festgestellt, dass die Wrapper-Funktion vorhanden ist Kein Rückgabewert. Um sicherzustellen, dass der Rückgabewert der dekorierten Funktion korrekt zurückgegeben werden kann, muss der Dekorator geändert werden:

如图加上第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.函数式编程

Das obige ist der detaillierte Inhalt vonWas bedeutet Python-Dekorator? Wie verwende ich Python-Dekoratoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn