Descriptor in Python

| | | | | | | | | | |

Descriptorprotocol:
In andere programmeertalen worden descriptors setter en getter genoemd, waarbij openbare functies worden gebruikt om een privévariabele op te halen en in te stellen. Python heeft geen concept van privévariabelen en het descriptorprotocol kan worden gezien als een Pythonische manier om zoiets te bereiken. Beschrijvingen — het is een nieuwe manier om klassen in Python te implementeren en het hoeft niets van een bepaald object te erven. Om eenvoudig descriptors in python te implementeren, moeten we ten minste een van de hierboven gedefinieerde methoden gebruiken. Merk op dat de onderstaande instantie het object retourneert waartoe het attribuut toegang heeft gekregen en dat de eigenaar de klasse is waarin de handle als attribuut is toegewezen. Er zijn drie protocollen in de Python-descriptor voor setters, getters en een verwijdermethode.

  • gfg .__ get __ (self, obj, type = None) : Dit attribuut wordt aangeroepen wanneer u de informatie (value = obj.attr) wilt krijgen en wat het ook retourneert is — dit is wat wordt doorgegeven aan de code die de attribuutwaarde heeft aangevraagd.
  • gfg .__ set __ (self, obj, value) : deze methode wordt aangeroepen om de attribuutwaarden in te stellen ‚Äã‚Äã(obj .attr = &# 39; waarde ') en het zal u niets teruggeven.
  • gfg .__ delete __ (self, obj) : deze methode wordt aangeroepen wanneer een attribuut wordt verwijderd uit een object (del obj.attr)

Descriptor-aanroep:
Descriptors worden automatisch aangeroepen wanneer een aanroep wordt ontvangen voor de set () -methode of de get () methode. obj.gfg zoekt bijvoorbeeld naar gfg in het woordenboek obj . Als gfg een __get __ () methode definieert, dan gfg .__ get __ (obj) . Het kan ook rechtstreeks worden aangeroepen door de naam van de methode, bijv. gfg .__ get __ (obj) .


# Toon Python-programma
# hoe de descriptor aan te roepen

def __ getattribuut __ ( zelf , sleutel):

v = object .__ getattribuut __ ( zelf , sleutel)

if hasattr ( v, `__get__` ):

return v .__ get __ ( Geen , zelf )

return v

Belangrijke punten om te onthouden:

  • Descriptors worden aangeroepen door de __getattribute __ () methode.
  • Het negeren van __getattribute__ () voorkomt automatische oproepen naar de descriptor.
  • object .__ getattribute __ () en type .__ getattribute __ () verschillende aanroepen naar __get __ ( ) .
  • Gegevensbeschrijvingen hebben altijd voorrang op instantiewoordenboeken.
  • Niet-gegevensbeschrijvingen kunnen worden overschreven door instantiewoordenboeken.

Een voorbeeld van een descriptor:
In dit voorbeeld stelt een gegevensdescriptor gewoonlijk waarden in en retourneert deze waarden ‚Äã‚Äãen drukt een bericht af waarin hun toegang wordt vastgelegd.
Code 1:


class Descriptor ( object ):

def __ init __ ( zelf , naam = ` `):

zelf . naam = naam


def __ get __ ( zelf , obj, objtype):

return " {} voor {} " . formaat ( zelf .name, zelf .naam)

def __ set __ ( zelf , obj, naam):

if isinstance (naam, str ):

zelf . naam = naam

else :

raise TypeError ( " Naam moet string zijn " )


class GFG ( object ):

naam = Descriptor ()

g = GFG ()

g.name = "Geeks"

print (g.name)

Afsluiten:

Python.Engineering

Code 2:


< tbody>

class Descriptor ( object ):


def __ init __ ( zelf , naam = ` `):

zelf . naam = naam


def __ get __ ( zelf , obj, objtype):

return "{} for {}" . formaat ( zelf .naam, zelf .naam)


def __ set __ ( zelf , obj, naam ):

if isinstance ( naam, str ):

zelf . naam = naam

else :

raise TypeError ( "Naam moet string zijn" )


class GFG ( object ):

naam = Descriptor ()


g = GFG ()

g.name = "Computer"

print (g.name)

Afsluiten:

 ComputerforComputer 

Maak een handle met eigenschap ():
eigenschap () , het is gemakkelijk om een bruikbare descriptor te maken voor elk attribuut. Syntaxis voor het maken van de eigenschap property()

 (fget = Geen, fset = Geen, fdel = Geen, doc = Geen) 

< table border = "0" cellpadding = "0" cellspacing = "0">

# Python-programma om de eigenschap ( ) functie


# Alfabet class

class Alfabet:

def __ init __ ( zelf , waarde):

zelf ._ waarde = waarde


# ophalen van waarden ‚Äã‚Äã

def getValue ( se lf ):

print ( `Waarde ophalen` )

return zelf ._ value


# installatiewaarden ‚Äã‚Äã

def setValue ( zelf , value):

print ( `Waarde instellen op` + waarde)

zelf ._ waarde = waarde


# remo ve waarden ‚Äã‚Äã

def delValue ( zelf ):

print ( `Waarde verwijderen` )

del zelf ._ waarde


waarde = eigenschap (getValue, setValue, delValue,)


# geef de waarde door

x = Alfabet ( `GeeksforGeeks` )

print (x.value)


x.value = `GfG`

del x.value

Afsluiten:

 Waarde ophalen Python.Engineering Waarde instellen op GfG Waarde verwijderen 

Een descriptor genereren met behulp van klassemethoden:
Hierin hebben we gemaakt. Laten we de klasse ophalen en een van de descriptormethoden overschrijven __set__ , __ get__ en __delete__ . Deze methode wordt gebruikt wanneer dezelfde descriptor vereist is voor veel verschillende klassen en attributen, bijvoorbeeld voor typecontrole.


class Descriptor ( object ):

def __ init__ ( zelf , naam = ` `):

self .name = naam

def __ get __ ( zelf , obj, objtype):

return " {} voor {} " . formaat ( zelf .naam, zelf .naam)


def __ set __ ( zelf , obj, naam ):

if isinstance (naam, str ):

zelf . naam = naam

else :

verhogen TypeError ( "Naam moet string zijn" )


class GFG ( object ):

naam = Descriptor ()


g = GFG ( )

g.name = "Geeks "

print (g.name)

Uitvoer:

 Python.Engineering 

Maak een descriptor met @property Decorator:
In deze we gebruiken de kracht van eigenschapdecorators, die een combinatie zijn van een eigenschapstypemethode en Python-decorators.


class Alfabet:

def __ init __ ( self , waarde):

zelf ._ waarde = waarde


# door waarden op te halen ‚Äã‚Äã

@ property

def waarde ( zelf ):

print ( `Waarde ophalen` )

return zelf ._ waarde

# instellingswaarden ‚Äã‚Äã

@ waarde . setter

def waarde ( zelf , value ):

print ( `Waarde instellen op ` + value)

zelf ._ value = waarde


# verwijder waarden ‚Äã‚Äã

@ value .deleter

def waarde ( zelf ):

print ( `Waarde verwijderen` )

del zelf ._ waarde



# geef de waarde door

x = Alfabet ( `Peter` )

print (x.value)


x.value = `Diesel`


del x.value

Afsluiten:

 Waarde ophalen Peter Waarde instellen op Diesel Waarde verwijderen 

Descriptor in Python __del__: Questions

Descriptor in Python __delete__: Questions

Shop

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Best laptop for Zoom

$499

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers

Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method