Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Dekoratorprinzip und Nutzungsanalyse

Python-Dekoratorprinzip und Nutzungsanalyse

不言
不言Original
2018-05-02 15:59:202338Durchsuche

Dieser Artikel stellt hauptsächlich das Prinzip und die Verwendung von Python-Dekoratoren vor und analysiert die Konzepte, Prinzipien, Verwendungsmethoden und zugehörigen Betriebsvorkehrungen von Python-Dekoratoren in Form von Beispielen. Freunde in Not können sich auf diesen Artikel beziehen

Beispiele beschreiben die Prinzipien und die Verwendung von Python-Dekoratoren. Teilen Sie es wie folgt mit allen als Referenz:

1. Die Essenz eines Dekorators ist eine Funktion , die hauptsächlich zum Dekorieren anderer Funktionen verwendet wird ist, Zusätzliche Funktionen zu anderen Funktionen hinzufügen

2. Prinzipien von Dekorateuren:

(1) Dekorateure können den Quellcode der dekorierten nicht ändern Funktion

(2) Dekorateure können die Aufrufmethode der dekorierten Funktion nicht ändern

3. Wissensreserve für die Implementierung von Dekoratoren

(1) Funktionen in Python sind „Variablen“

a. Speicherung von Variablen in Python

x='Tomwenxing'
y=x

[Erklärung]:

Wenn der Python-Interpreter auf die Anweisung x='Tomwenxing' stößt Es erledigt hauptsächlich zwei Aufgaben:

 1. Erstellen Sie einen Platz im Speicher, um die Zeichenfolge „Tomwenxing“ zu speichern

2. Erstellen Sie eine Variable mit dem Namen x im Speicher und verwenden Sie sie, um auf den von der Zeichenfolge „Tomwenxing“ belegten Speicherplatz zu zeigen (kann als Beziehung zwischen Raum und Raumnummer verstanden werden)

und die Anweisung y=x bedeutet, die Referenz der Variablen x auf die Zeichenfolge der Variablen y zuzuweisen, Das heißt, erstellen Sie eine Variable y im Speicher und verweisen Sie auf den Speicherbereich, auf den die Variable x zeigt

b Die Funktion ist in der Speicherung in Python

def test():
  pass

[Erklärung]:

In Python ist die Speicherung von Funktionen ähnlich wie bei Variablen. Nehmen Sie die obige Funktion als Beispiel , Python-Erklärung Es macht hauptsächlich zwei Dinge:

1. Öffnen Sie einen Speicherplatz im Speicher, um die Zeichenfolge des Funktionscodes zu speichern (in diesem Beispiel hat der Code nur ein Satz: bestanden)

2. Erstellen Sie einen Variablentest im Speicher, um auf den Speicherplatz zu verweisen, in dem die Funktionscodezeichenfolge gespeichert ist (Entspricht test='function body')

In Python sind Funktionen also Variablen

(2) Funktion höherer Ordnung (eine Funktion höherer Ordnung erfüllt eine der folgenden beiden Bedingungen)

a. Übergeben Sie einen Funktionsnamen als tatsächlichen Parameter an einen anderen Funktion

[Auswirkungen auf Dekorateure]: Erzielen Sie den Effekt „Hinzufügen von Funktionalität zur dekorierten Funktion, ohne ihren Quellcode zu ändern“

import time
def bar():
  time.sleep(2)
  print('in the bar')
def test(func):
  start_time=time.time()
  func()
  stop_time=time.time()
  print('函数的运行时间为:',stop_time-start_time)
test(bar)

Wird ausgeführt Ergebnisse:

in der Leiste
Die Laufzeit der Funktion beträgt: 2.0021145343780518

b. Der Rückgabewert enthält den Funktionsnamen

[Auswirkungen auf Dekorateure]: Erzielen Sie den Effekt „die Art und Weise, wie die Funktion aufgerufen wird, nicht zu ändern“

import time
def bar():
  time.sleep(3)
  print('in the bar')
def test2(func):
  print('新添加的功能')
  return func
bar=test2(bar)
bar()

Ausführungsergebnisse:

Neu hinzugefügte Funktionen
in der Leiste

(3) Verschachtelte Funktion: Verwenden Sie def in einem Funktionskörper, um eine neue Funktion (keinen Aufruf) zu deklarieren

def foo():
  print('in the foo')
  def bar(): #声明一个新的函数,而不是调用函数
    print('in the bar')
  bar()
foo()

Laufergebnis :

im foo
in der Leiste

4. Dekorator-Syntax: Funktion höherer Ordnung + verschachtelte Funktion => Dekorator (das folgende Beispiel kann debuggt werden mit pycharm Debuggen Sie es mit einem Computer, um die laufende Sequenz des Codes zu sehen)

import time
def timer(func):
  def deco(*args,**kwargs):#使用了不定参数
    start_time=time.time()
    res=func(*args,**kwargs) #运行函数
    stop_time=time.time()
    print('运行时间:',stop_time-start_time)
    return res # 若无返回值,则返回None
  return deco
@timer #等价于test1=timer(test1)=deco,即test1()=deco()
def test1():
  time.sleep(3)
  print('in the test1')
@timer #等价于test2=timer(test2)=deco,即test2(name)=deco(name)
def test2(name):
  time.sleep(3)
  print('in the test2',name)
test1()
print('-------------分界线------------------------')
test2('Tomwenxing')

Laufende Ergebnisse:

im Test1
Laufzeit: 3,0001718997955322
-- ----- ------Grenzlinie-------
im Test2 Tomwenxing
Laufzeit: 3.000171422958374

5. Decorator mit Parametern

# -*- coding:utf-8 -*-
user,passwd='Tomwenxing','123'
#如装饰器带参数,一般是三层嵌套
def auth(auth_type): #第一层的参数是装饰器的参数
  def outer_wrapper(func):#第二层的参数是装饰器要装饰的目标函数
    def wrapper(*args,**kwargs):#第三次的参数是目标函数的参数
      if auth_type=='local':
        username = input('Username:').strip()
        password = input('Password:').strip()
        if user == username and passwd == password:
          print('用户Tomwenxing已经成功登录!')
          res = func(*args, **kwargs) #运行目标函数
          return res
        else:
          exit('用户名或密码有错误')
      elif auth_type=='ldap':
        print('暂不支持这种登录方式!')
    return wrapper
  return outer_wrapper
def index():
  print('欢迎来到index页面')
@auth(auth_type='local') #home=wrapper()
def home(name):
  print('%s,欢迎来到home页面' %name)
  return 'This is home page'
@auth(auth_type='ldap')
def bbs():
  print('欢迎来到bbs页面 ')
index()
print('----------------------分界线-------------------')
print('函数的返回值为:',home('wenxing'))
print('----------------------分界线-------------------')
bbs()

Laufende Ergebnisse:

Willkommen auf der Indexseite
---------- - ---------Grenzlinie-----
Benutzername:Tomwenxing
Passwort:123
Benutzer Tomwenxing hat sich bereits angemeldet erfolgreich!
wenxing, willkommen auf der Homepage
Der Rückgabewert der Funktion ist: Dies ist die Homepage
------------------------------------- Grenzlinie -------------------
Diese Anmeldemethode wird noch nicht unterstützt!

Verwandte Empfehlungen:

Verwenden Sie Python Decorator, um die Funktionslaufzeit zu berechnen

Python-Iteratordefinition und einfache Nutzungsanalyse

Das obige ist der detaillierte Inhalt vonPython-Dekoratorprinzip und Nutzungsanalyse. 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