GeeksforGeeks
Voorvereiste: Underscore in Python
In Python bestaan er geen “Private” instance variabelen die niet kunnen worden benaderd behalve binnen een object. Echter, een conventie wordt gevolgd door de meeste Python code en programmeurs, namelijk, een naam voorafgegaan door een underscore, bijvoorbeeld _geek moet worden behandeld als een niet-openbaar deel van de API of elke Python code, of het nu een functie, een methode, of een data lid is. Terwijl we dit doornemen, proberen we ook het concept van verschillende vormen van underscores te begrijpen, bijvoorbeeld, for _ in range(10), __init__(self).
Mangling en hoe het werkt
In Python is er iets dat name mangling wordt genoemd, wat betekent dat er een beperkte ondersteuning is voor een geldige use-case voor class-private members, in principe om naambotsingen te voorkomen van namen met namen die zijn gedefinieerd door subclasses. Elke identifier van de vorm __geek (minstens twee voorloop underscores of hoogstens één achterloop underscore) wordt vervangen door _classname__geek, waarbij classname de huidige classnaam is met een voorloop underscore(s) gestript. Zolang dit binnen de definitie van de klasse gebeurt, wordt dit gemangeld. Dit is handig om subklassen methoden te laten overriden zonder dat de aanroepen van methoden binnen de klasse worden verbroken.
Laten we eens kijken naar dit voorbeeld en proberen uit te vinden hoe deze underscore werkt:
De mangling regels zijn vooral bedoeld om ongelukken te voorkomen, maar het is nog steeds mogelijk om een variabele te benaderen of te wijzigen die als privé wordt beschouwd. Dit kan zelfs handig zijn in speciale omstandigheden, zoals in de debugger.
_Single Leading Underscores
Dus eigenlijk betekent één onderstreping aan het begin van een methode, functie, of data member dat je deze methode niet mag benaderen, omdat het geen onderdeel is van de API. Laten we eens kijken naar dit stukje code:
Het fragment is afkomstig uit de Djangobroncode (django/forms/forms.py). Dit suggereert dat errors een eigenschap is, en het is ook een onderdeel van de API, maar de methode, _get_errors, is “private”, dus men moet er geen toegang toe hebben.
__Double Leading Underscores
Twee onderstrepingen, in het begin, zorgen voor veel verwarring. Dit gaat meer over syntax dan over een conventie. dubbele underscore zal de attribuutnamen van een klasse verwringen om conflicten van attribuutnamen tussen klassen te voorkomen. Bijvoorbeeld:
__Double leading and Double trailing underscores__
Er is nog een ander geval van dubbele leading en trailing underscores. We volgen dit bij het gebruik van speciale variabelen of methoden (de zogenaamde “magische methode”), zoals__len__, __init__. Deze methodes geven speciale syntactische eigenschappen aan de namen. Bijvoorbeeld, __file__ geeft de locatie van het Python bestand aan, __eq__ wordt uitgevoerd wanneer a == b expressie wordt uitgevoerd.
Voorbeeld:
class
Geek:
def
__init__(
self
, ab):
self
.ab
=
ab
def
__custom__(
self
):
pass
This article is contributed by Chinmoy Lenka. Als je GeeksforGeeks leuk vindt en een bijdrage wilt leveren, kun je ook een artikel schrijven via contribute.geeksforgeeks.org of mail je artikel naar [email protected]. Zie je artikel verschijnen op de GeeksforGeeks hoofdpagina en help andere Geeks.
Ik heb verwezen naar Python Docs, hackernoon.com en igorsobreira.com
Gelieve commentaar te schrijven als je iets onjuist vindt, of als je meer informatie wilt delen over het onderwerp dat hierboven is besproken.
Opgelet geek! Versterk je basis met de Python Programming Foundation Course en leer de basis.
Om te beginnen met je interviewvoorbereidingen Verbeter je Data Structures-concepten met de Python DS Course.