Python

Handleiding voor Python-beschrijvingen

Handleiding voor Python-beschrijvingen
Een handige techniek voor het schrijven van generieke code die tussen de klassen kan worden hergebruikt, wordt ondersteund door Python-descriptors, of beter bekend als descriptors. Ze klinken misschien dicht bij het begrip overerving, maar dat zijn ze niet. Dit is een directe techniek om toegang tot attributen met een bindend karakter vast te leggen. Descriptors zijn een basisfunctie van Python die veel van de tovenarij beheerst, verborgen onder de dekking van de taal. Als je ooit het gevoel hebt gehad dat Python-descriptors met weinig functionele implementaties een geavanceerd onderwerp zijn, dan is deze tutorial het ultieme platform om je deze krachtige functie te laten begrijpen.

Descriptormethoden

Om het duidelijk te stellen, een klasse die implementeert __krijgen_(), __set()_, of __delete()_ functie van een descriptorprotocol voor een object wordt geclassificeerd als een "Descriptor". Om de parameters van verschillende klassen te beheren die het object als referentie gebruiken, worden Python-descriptors gemaakt. Hier zijn drie gespecificeerde methoden, die zullen worden gebruikt in descriptors:

__krijgen__(): Wanneer u probeert de gegevens te extraheren, wordt de __krijgen__() attribuut wordt aangeroepen, en wat het ook biedt, is wat er aan de code zou worden verstrekt die de waarde van één variabele eist. Het is gecategoriseerd als een niet-gegevensdescriptor en is alleen leesbaar.

__set__(): De functie __set__() wordt aangeroepen om de parameterwaarden aan te passen, en er wordt niets naar u teruggestuurd door deze functie. Het staat bekend als een gegevensdescriptor die niet alleen leesbaar maar ook beschrijfbaar is.

__verwijder__(): Telkens wanneer de parameter van een object wordt verwijderd, wordt de __verwijder__() functie heet. Het staat bekend als een gegevensdescriptor die niet alleen leesbaar maar ook beschrijfbaar is.

U hoeft het descriptorprotocol alleen af ​​te dwingen als u Python-descriptors in uw script gebruikt. De meest belangrijke functies van het protocol zijn: krijgen() en stel() met de daaropvolgende handtekening.

__get__(zelf, obj, type=Geen) -> object
__set__(zelf, obj, waarde) -> Geen

zelf is de instantie van de descriptor.
obj is een instantie van het object waarmee uw descriptor is verbonden.
type is het type van een object.

Voorbeeld:

Hier hebben we twee klassen gedefinieerd. In de klasse Descriptor hebben we descriptormethoden gedefinieerd. In de krijgen() methode, het zelf is de instantie voor de descriptor 'val', het krijgt een waarde 'Geeks' en slaat het op. Dan maakt het een string met 'for' tussen het opgegeven attribuut. klassedescriptor(object):

def __get__(zelf, obj, objtype):
terugkeren voor".formaat (zelf.val, zelf.val)

Het zal dan de waarde teruggeven aan de set() methode. Deze functie controleert vervolgens de waarde, of het een string is of niet. Als de waarde een tekenreeks is, wordt deze opgeslagen in een attribuut met de naam 'val'. Als de waarde geen tekenreeks is, wordt er een uitzondering gegenereerd.

def __set__(zelf, obj, val):
if isinstance(val, str):
zelf.val = val
anders:
raise TypeError ("Naam moet string zijn")

Daarna wordt de waarde afgedrukt als een string 'GeeksforGeeks'.

klasse GFG(object):
val = descriptor()
g = GFG()
g.val = "Geeks"
afdrukken (g.val)

Wanneer u deze code probeert uit te voeren, krijgt u de volgende uitvoer:

GeeksforGeeks

Doel van descriptoren

Laten we een klasse met de naam 'thuis' beschrijven met drie kenmerken, namelijk: plaats, gebied en prijs. U kunt de functie gebruiken: __in het__() om de klasseattributen te initialiseren.

klas thuis:

def __init__(zelf,loc,gebied,prijs):

Vervolgens kunt u de functie __str__(), die het resultaat kan retourneren van de drie attributen die u aan de klasse zou kunnen doorgeven bij het bouwen van het item. De functie __str__() retourneert de string.

Wanneer u deze code uitvoert, wordt de schijnbaar correcte uitvoer weergegeven.

Laten we nu proberen de prijs van het huis te veranderen in een negatieve waarde, zoals hieronder, en de code uitvoeren.

Er is helemaal geen verandering, behalve het minteken, zoals weergegeven in de uitvoer. Wacht even! Hier klopt iets niet, nietwaar?? Hoe komt het dat de prijs van een huis negatief is?. Python staat het toe omdat Python een veelzijdige ontwikkelomgeving is die typecontrole niet toestaat.

Laten we een 'if'-statement initialiseren in __in het__() functie om een ​​uitzondering op te heffen als de waarde of prijs lager is dan nul.

Vanaf nu merkt u misschien dat het goed presteert, en als de prijs lager is dan nul, genereert de code een waardefout.

Zoals we misschien begrijpen, is de __in het_() functie is een constructor en wordt slechts één keer aangeroepen wanneer u een klasseobject maakt. Daarom zou een aangepaste typecontrole later mislukken. Python biedt descriptors die gespecialiseerd zijn in het oplossen van alle bovenstaande problemen. Laten we nu descriptors in hetzelfde voorbeeld gaan gebruiken om het goed te begrijpen.

De klasse Descriptor' __in het_() functie heeft een lokale variabele __price op 0. Aan het begin betekent een dubbel onderstrepingsteken dat de parameter privé is. Het wordt gebruikt om de prijsparameter van de descriptorklasse te onderscheiden van de thuisklasse.

De __krijgen__() methode zal de prijs retourneren. De attribuutinstantie bevat h1, wat een descriptorinstantie is. Kenmerkeigenaar verwijst naar de naam van de klas 'thuis' en retourneert de prijs.

De functie __set__() heeft een attribuut voorbeeld die h1 bevat, en een toe te wijzen waarde. Controle wordt gebruikt om de waarde te bevestigen confirm. Als de waarde een geheel getal is, wordt deze afgedrukt, anders geeft de code een Type Error-uitzondering. Als de waarde onder nul is, wordt de Value Error-uitzondering in de code gegooid.

De __verwijder__() functie wordt uitgevoerd wanneer het parameterkenmerk van een object wordt verwijderd.

De thuisklasse blijft hetzelfde, hoewel de instantie prijs van de klasse Descriptor() is toegevoegd. In de __in het_() functie, voeg het prijskenmerk toe aan de instantieprijs, en het zal de . aanroepen __set_() functie.

Tijdens het uitvoeren van deze code krijgt u een waardefout omdat de prijs nooit nul kan zijn.

Probeer nu de code uit te voeren met een tekenreekswaarde.

Het zal een Type Error-uitzondering genereren.

De bestaande instantiewaarde wordt overschreven bij de vorming van een nieuwe instantie, aangezien de descriptors gerelateerd zijn aan de klasse en niet aan de instantie. Kijk hieronder eens:

De eerste waarde is overschreven door de tweede.

Conclusie

We kunnen begrijpen waarom descriptors van Python zo'n fascinerend onderwerp zijn geworden en aan wat voor soort gebruiksscenario's je ze kunt toevoegen door deze tutorial te doorlopen.

Hoe de muisaanwijzer en cursorgrootte, kleur en schema op Windows 10 te veranderen
De muisaanwijzer en cursor in Windows 10 zijn zeer belangrijke aspecten van het besturingssysteem. Dit geldt ook voor andere besturingssystemen, dus i...
Gratis en open source game-engines voor het ontwikkelen van Linux-games
Dit artikel behandelt een lijst met gratis en open source game-engines die kunnen worden gebruikt voor het ontwikkelen van 2D- en 3D-games op Linux. E...
Shadow of the Tomb Raider voor Linux-zelfstudie
Shadow of the Tomb Raider is de twaalfde toevoeging aan de Tomb Raider-serie - een actie-avonturengame-franchise gemaakt door Eidos Montreal. De game ...