Python

Tutorial zu Python-Deskriptoren

Tutorial zu Python-Deskriptoren
Eine nützliche Technik zum Schreiben von generischem Code, der zwischen den Klassen wiederverwendet werden könnte, wird von Python-Deskriptoren oder besser bekannt als Deskriptoren unterstützt. Sie mögen dem Begriff der Vererbung nahe kommen, sind es aber nicht. Dies ist eine direkte Technik, um den Zugriff auf Attribute mit verbindlichem Charakter zu erfassen. Deskriptoren sind eine grundlegende Funktion von Python, die einen Großteil der Zauberei regelt und unter dem Deckmantel der Sprache verborgen ist. Wenn Sie jemals das Gefühl hatten, dass Python-Deskriptoren mit kleinen funktionalen Implementierungen ein fortgeschrittenes Thema sind, dann ist dieses Tutorial die ultimative Plattform, um diese leistungsstarke Funktion zu verstehen.

Deskriptormethoden

Um es klar zu sagen, eine Klasse, die implementiert __erhalten_(), __einstellen()_, oder __löschen()_ Funktion eines Deskriptorprotokolls für ein Objekt wird als „Deskriptor“ klassifiziert. Um die Parameter verschiedener Klassen zu steuern, die das Objekt als Referenz verwenden, werden Python-Deskriptoren erstellt. Hier sind drei spezifizierte Methoden, die in Deskriptoren verwendet werden:

__erhalten__(): Wenn Sie versuchen, die Daten zu extrahieren, __erhalten__() Attribut aufgerufen wird, und was auch immer es liefert, wird dem Code übergeben, der den Wert einer Variablen verlangt. Es wird als Nicht-Datendeskriptor kategorisiert und ist nur lesbar.

__einstellen__(): Die Funktion __einstellen__() wird aufgerufen, um die Parameterwerte anzupassen, und von dieser Funktion wird nichts an Sie zurückgegeben. Es ist als Datendeskriptor bekannt, der nicht nur lesbar, sondern auch beschreibbar ist.

__löschen__(): Immer wenn der Parameter von einem Objekt entfernt wird, __löschen__() Funktion heißt. Es ist als Datendeskriptor bekannt, der nicht nur lesbar, sondern auch beschreibbar ist.

Sie müssen das Deskriptorprotokoll nur erzwingen, wenn Sie Python-Deskriptoren in Ihrem Skript verwenden. Die wichtigsten Funktionen des Protokolls sind erhalten() und einstellen() die nachfolgende unterschrift haben.

__get__(self, obj, type=None) -> Objekt
__set__(self, obj, value) -> Keine

selbst ist die Instanz des Deskriptors.
obj ist eine Instanz des Objekts, mit dem Ihr Deskriptor verbunden ist.
Art ist der Typ eines Objekts.

Beispiel:

Hier haben wir zwei Klassen definiert. In der Klasse Descriptor haben wir Deskriptormethoden definiert. In dem erhalten() Methode, das self ist die Instanz für den Deskriptor 'val', es bekommt einen Wert 'Geeks' und speichert ihn. Dann wird eine Zeichenfolge mit 'for' zwischen dem bereitgestellten Attribut erstellt. Klassendeskriptor (Objekt):

def __get__(self, obj, objtype):
zurückkehren für".format (selbst.val, selbst.Wert)

Es wird dann den Wert an die set() Methode zurückgeben. Diese Funktion prüft dann auf den Wert, ob es sich um einen String handelt oder nicht. Falls der Wert ein String ist, wird er in einem Attribut namens 'val' gespeichert. Wenn der Wert kein String ist, wird eine Ausnahme ausgelöst.

def __set__(self, obj, val):
if isInstanz(val, str):
selbst.val = val
sonst:
raise TypeError("Name sollte String sein")

Danach wird der Wert als String 'GeeksforGeeks' ausgegeben.

Klasse GFG(Objekt):
val = Deskriptor()
g = GFG()
G.val = "Geeks"
drucken (g.Wert)

Wenn Sie versuchen, diesen Code auszuführen, erhalten Sie die folgende Ausgabe:

GeeksforGeeks

Zweck von Deskriptoren

Beschreiben wir eine Klasse namens 'home' mit drei Merkmalen, nämlich: Ort, Fläche und Preis. Sie können die Funktion verwenden __drin__() um die Klassenattribute zu initialisieren.

Klasse nach Hause:

def __init__(self,loc,area,price):

Dann können Sie die Funktion __str__() verwenden, die das Ergebnis der drei Attribute zurückgeben könnte, die Sie beim Erstellen des Elements an die Klasse übergeben können. Die Funktion __str__() gibt den String zurück.

Wenn Sie diesen Code ausführen, wird die scheinbar korrekte Ausgabe angezeigt.

Versuchen wir nun, den Preis des Hauses wie unten beschrieben auf einen negativen Wert zu ändern, und führen Sie den Code aus.

Es gibt überhaupt keine Änderung, außer dem negativen Vorzeichen, wie in der Ausgabe gezeigt. Abwarten! Hier stimmt was nicht, oder?? Wie kommt es, dass der Preis eines Hauses negativ ist?. Python lässt dies zu, da Python eine vielseitige Entwicklungsumgebung ist, die insbesondere keine Typprüfung zulässt.

Lassen Sie uns eine 'if'-Anweisung in initialisieren __drin__() Funktion zum Auslösen einer Ausnahme, wenn der Wert oder Preis kleiner als Null ist.

Ab sofort können Sie feststellen, dass es gut funktioniert, und wenn der Preis unter Null liegt, generiert der Code einen Wertfehler.

Wie wir vielleicht verstehen, ist die __drin_() function ist ein Konstruktor und wird nur einmal aufgerufen, wenn Sie ein Klassenobjekt erstellen. Daher würde später die benutzerdefinierte Typprüfung fehlschlagen. Python bietet Deskriptoren, die darauf spezialisiert sind, alle oben genannten Probleme zu beheben. Beginnen wir nun mit der Verwendung von Deskriptoren im selben Beispiel, um es gut zu verstehen.

Die Descriptor-Klasse' __drin_() Funktion hat eine lokale Variable __price bei 0. Am Anfang bedeutet ein doppelter Unterstrich, dass der Parameter privat ist. Es wird verwendet, um den Preisparameter der Deskriptorklasse von der Hausklasse zu unterscheiden.

Das __erhalten__() Methode gibt den Preis zurück. Die Attributinstanz enthält h1, die eine Deskriptorinstanz ist. Der Attributbesitzer verweist auf den Namen der Klasse 'home' und gibt den Preis zurück.

Die Funktion __einstellen__() hat ein Attribut Beispiel die h1 enthält und einen zuzuweisenden Wert. Check wird verwendet, um den Wert zu bestätigen. Wenn der Wert eine Ganzzahl ist, wird er ausgegeben, andernfalls wird der Code mit einer Typfehler-Ausnahme ausgelöst. Wenn der Wert unter Null liegt, wird die Value Error-Ausnahme in den Code geworfen.

Das __löschen__() Funktion wird ausgeführt, wenn das Parameterattribut von einem Objekt entfernt wird.

Die Heimatklasse bleibt gleich, obwohl die Instanz Preis der Klasse Descriptor() wird hinzugefügt. In dem __drin_() Funktion, fügen Sie das Preisattribut zum Instanzpreis hinzu, und es ruft die __einstellen_() Funktion.

Während Sie diesen Code ausführen, erhalten Sie einen Wertfehler, da der Preis niemals Null sein kann.

Versuchen Sie nun, den Code mit einem String-Wert auszuführen.

Es wird eine Typfehler-Ausnahme ausgelöst.

Der vorhandene Instanzwert wird bei der Bildung einer neuen Instanz überschrieben, da sich die Deskriptoren auf die Klasse und nicht auf die Instanz beziehen. Schauen Sie sich unten an:

Der erste Wert wurde mit dem zweiten überschrieben.

Fazit

Wir können verstehen, warum Deskriptoren aus Python zu einem so faszinierenden Thema geworden sind und zu welchen Nutzungsszenarien Sie sie hinzufügen können, indem Sie dieses Tutorial durchgehen.

Beste Befehlszeilenspiele für Linux
Die Befehlszeile ist nicht nur Ihr größter Verbündeter bei der Verwendung von Linux – sie kann auch eine Quelle der Unterhaltung sein, da Sie damit vi...
Beste Gamepad-Mapping-Apps für Linux
Wenn du Spiele unter Linux gerne mit einem Gamepad statt mit einem typischen Tastatur- und Maus-Eingabesystem spielst, gibt es einige nützliche Apps f...
Nützliche Tools für Linux-Spieler
Wenn Sie gerne unter Linux spielen, haben Sie wahrscheinlich Apps und Dienstprogramme wie Wine, Lutris und OBS Studio verwendet, um das Spielerlebnis ...