Dekorateur
Der vorherige Artikel hat etwas über Abschlüsse gelernt, indem ein Anforderungsproblem gelöst wurde, und dieser Artikel wird dasselbe tun, indem er Schritt für Schritt etwas über Python-Dekoratoren lernt, indem er eine Anforderung langsam weiterentwickelt.
Zuallererst gibt es eine Funktion, die Mitarbeiter-Einstempelinformationen ausgibt:
def punch(): print('昵称:两点水 部门:做鸭事业部 上班打卡成功') punch()
Die Ausgabeergebnisse sind wie folgt:
昵称:两点水 部门:做鸭事业部 上班打卡成功
Dann Produkt-Feedback, nein, Es gibt keine bestimmte Möglichkeit, sich am Arbeitsplatz einzustempeln, und auch kein konkretes Check-in-Datum. Dies sollte sehr einfach sein und in wenigen Minuten gelöst werden können. Okay, dann fügen Sie einfach den Code zum Drucken des Datums wie folgt hinzu:
import time def punch(): print(time.strftime('%Y-%m-%d', time.localtime(time.time()))) print('昵称:两点水 部门:做鸭事业部 上班打卡成功') punch()
Das Ausgabeergebnis ist wie folgt:
2018-01-09 昵称:两点水 部门:做鸭事业部 上班打卡成功
Diese Änderung ist in Ordnung, aber diese Änderung ändert die Funktionsstruktur des Als diese Funktion definiert wurde, sollte sie Informationen über einen Mitarbeiter drucken und anzeigen, dass der Check-in erfolgreich war. Das Hinzufügen des Codes zum Drucken des Datums kann nun zu vielen Problemen bei der Codeduplizierung führen. An einer anderen Stelle müssen beispielsweise nur Mitarbeiterinformationen gedruckt und erfolgreich eingegeben werden, es ist jedoch kein Datum erforderlich. Müssen Sie also eine Funktion neu schreiben? Darüber hinaus wird diese funktionale Methode zum Drucken des aktuellen Datums häufig verwendet und kann als öffentliche Funktion für jede Modulmethode aufgerufen werden. Selbstverständlich ist dies alles als Gesamtprojekt zu betrachten.
In diesem Fall können wir funktionale Programmierung verwenden, um diesen Teil des Codes zu ändern. Denn durch frühere Studien wissen wir, dass Python-Funktionen auch ein Objekt sind und Funktionen in Funktionen verschachtelt werden können. Ändern Sie dann den Code so:
import time def punch(): print('昵称:两点水 部门:做鸭事业部 上班打卡成功') def add_time(func): print(time.strftime('%Y-%m-%d', time.localtime(time.time()))) func() add_time(punch)
Ausgabeergebnis:
2018-01-09 昵称:两点水 部门:做鸭事业部 上班打卡成功
Haben Sie festgestellt, dass auf diese Weise die Punch-Methode nicht geändert wird und jede Funktion, die das aktuelle Datum drucken muss, die Funktion an add_time übergeben kann? Das ist es, einfach so:
import time def punch(): print('昵称:两点水 部门:做鸭事业部 上班打卡成功') def add_time(func): print(time.strftime('%Y-%m-%d', time.localtime(time.time()))) func() def holiday(): print('天气太冷,今天放假') add_time(punch) add_time(holiday)
Druckergebnis:
2018-01-09 昵称:两点水 部门:做鸭事业部 上班打卡成功 2018-01-09 天气太冷,今天放假
Ist die Funktionsprogrammierung sehr praktisch, aber jedes Mal, wenn wir sie aufrufen, müssen wir die ursprüngliche Funktion ersetzen. Übergeben Sie sie Gibt es als Parameter eine bessere Möglichkeit, es zu implementieren? Ja, es ist der Dekorator, den ich in diesem Artikel vorstellen werde, da die Art und Weise, einen Dekorator zu schreiben, tatsächlich der eines Abschlusses ähnelt, es jedoch keine freien Variablen gibt. Daher ist hier die Art und Weise, den Dekorator im obigen Code zu schreiben Zum Vergleich: Was ist der Unterschied zwischen Schreiben und funktionaler Programmierung?
import time def decorator(func): def punch(): print(time.strftime('%Y-%m-%d', time.localtime(time.time()))) func() return punch def punch(): print('昵称:两点水 部门:做鸭事业部 上班打卡成功') f = decorator(punch) f()
Ausgabeergebnis:
2018-01-09 昵称:两点水 部门:做鸭事业部 上班打卡成功
Durch den Code können Sie erkennen, dass die Dekoratorfunktion im Allgemeinen diese drei Dinge tut:
Erhält eine Funktion als Parameter
Verschachteln Sie eine Wrapper-Funktion, Die Wrapper-Funktion empfängt die gleichen Parameter wie die Originalfunktion, führt die Originalfunktion aus und führt auch zusätzliche Funktionen aus
Verschachtelte Funktionen zurückgeben
Wenn Sie sich diesen Code jedoch genau ansehen, ist der Weg Der Dekorateur ist geschrieben. Warum ist es problematischer als funktionale Programmierung? Und es sieht kompliziert aus, sogar ein bisschen unnötig.
Das liegt daran, dass wir den „syntaktischen Zucker“ des Dekorators noch nicht verwendet haben. Wenn wir uns den obigen Code ansehen, können wir sehen, dass bei der Einführung des Dekorators (Decorator) keine neuen Syntaxfunktionen eingeführt wurden alles basiert auf grammatikalischen Merkmalen. Dies zeigt auch, dass Dekoratoren nicht nur in Python vorkommen, sondern eine Programmieridee sind, die allen Sprachen gemeinsam ist. Es ist nur so, dass Python @-Syntaxzucker entworfen hat, was den Prozess der Definition eines Dekorators, des Aufrufs des Dekorators der Originalfunktion und der Zuweisung des Ergebnisses zum Objektnamen der Originalfunktion einfacher, bequemer und einfacher zu bedienen macht, so der Kern Der Python-Dekorator kann sagen, dass es sein syntaktischer Zucker ist.
Wie nutzt man also den Syntaxzucker? Es ist sehr einfach, nachdem Sie die Dekoratorfunktion gemäß der oben beschriebenen Schreibmethode geschrieben haben, fügen Sie @ und den Funktionsnamen des Dekorators direkt zur ursprünglichen Funktion hinzu. Wie folgt:
import time def decorator(func): def punch(): print(time.strftime('%Y-%m-%d', time.localtime(time.time()))) func() return punch @decorator def punch(): print('昵称:两点水 部门:做鸭事业部 上班打卡成功') punch()
Ausgabeergebnis:
2018-01-09 昵称:两点水 部门:做鸭事业部 上班打卡成功
Dann ist dies für unsere Aufrufe sehr praktisch, nachdem wir den Dekorator direkt im Original verwendet haben Der syntaktische Zucker des Dekorators für die Funktion. Es gibt keine Änderung an dieser Funktion und die aufrufende Stelle muss nicht geändert werden.
Hier gab es jedoch immer ein Problem, das heißt, die Ausgabe von Punch-In-Informationen ist behoben, sodass wir sie über Parameter übergeben müssen. Wie schreibe ich den Dekorator? Die Funktion im Dekorator kann Variablenparameter *args verwenden, aber nur die Verwendung von *args kann nicht alle Parameter umfassen. Um mit Schlüsselwortparametern kompatibel zu sein, müssen wir auch **kwargs hinzufügen.
Daher kann die endgültige Form des Dekorators wie folgt geschrieben werden:
import time def decorator(func): def punch(*args, **kwargs): print(time.strftime('%Y-%m-%d', time.localtime(time.time()))) func(*args, **kwargs) return punch @decorator def punch(name, department): print('昵称:{0} 部门:{1} 上班打卡成功'.format(name, department)) @decorator def print_args(reason, **kwargs): print(reason) print(kwargs) punch('两点水', '做鸭事业部') print_args('两点水', sex='男', age=99)
Das Ausgabeergebnis lautet wie folgt:
2018-01-09 昵称:两点水 部门:做鸭事业部 上班打卡成功 2018-01-09 两点水 {'sex': '男', 'age': 99}
Dies ist das Ende der Artikelserie über den Einstieg in Python.