GeeksforGeeks
Förutsättning: I Python finns det inga ”privata” instansvariabler som inte kan nås annat än inom ett objekt. En konvention följs dock av de flesta Pythonkoder och kodare, dvs. att ett namn som föregås av ett understreck, t.ex. _geek, ska behandlas som en icke-offentlig del av API:et eller någon Pythonkod, oavsett om det är en funktion, en metod eller en datamedlem. Medan vi går igenom detta skulle vi också försöka förstå begreppet olika former av avslutande understreckare, t.ex. for _ in range(10), __init__(self).
Mangling och hur det fungerar
I Python finns det något som kallas namnmangling, vilket innebär att det finns ett begränsat stöd för ett giltigt användningsområde för klass-privata medlemmar i princip för att undvika namnkollisioner av namn med namn som definieras av underklasser. Alla identifierare av formen __geek (minst två inledande understrykningar eller högst en avslutande understrykning) ersätts med _classname__geek, där classname är det aktuella klassnamnet med en eller flera inledande understrykningar borttagna. Så länge det sker inom definitionen av klassen görs denna mangling. Detta är användbart för att låta underklasser åsidosätta metoder utan att bryta metodanrop inom klassen.
Låt oss titta på det här exemplet och försöka ta reda på hur den här understrykningen fungerar:
Manglingreglerna är främst utformade för att undvika olyckor, men det är fortfarande möjligt att få tillgång till eller ändra en variabel som anses vara privat. Detta kan till och med vara användbart under speciella omständigheter, till exempel i debuggaren.
_Single Leading Underscores
Så i princip betyder ett understreck i början av en metod, funktion eller datamedlem att du inte ska få tillgång till den här metoden eftersom den inte är en del av API:et. Låt oss titta på det här kodstycket:
Snittet är hämtat från Djangos källkod (django/forms/forms.py). Detta tyder på att errors är en egenskap och att den också är en del av API:et, men metoden _get_errors är ”privat”, så man bör inte få tillgång till den.
__Double Leading Underscores
Två understrykningar, i början, orsakar en hel del förvirring. Detta handlar om syntax snarare än en konvention. dubbla understrykningar manglar attributnamnen för en klass för att undvika konflikter av attributnamn mellan klasser. Till exempel:
Dubbla ledande och dubbla avslutande understrykningar__
Det finns ett annat fall av dubbla ledande och avslutande understrykningar. Vi följer detta när vi använder speciella variabler eller metoder (kallade ”magiska metoder”) som__len__, __init__. Dessa metoder ger namnen särskilda syntaktiska egenskaper. Till exempel anger __file__ platsen för Pythonfilen, __eq__ exekveras när uttrycket a == b exekveras.
Exempel:
class
Geek:
def
__init__(
self
, ab):
self
.ab
=
ab
def
__custom__(
self
):
pass
This article is contributed by Chinmoy Lenka. Om du gillar GeeksforGeeks och vill bidra kan du också skriva en artikel via contribute.geeksforgeeks.org eller maila din artikel till [email protected]. Se din artikel dyka upp på GeeksforGeeks huvudsida och hjälp andra nördar.
Jag har hänvisat till Python Docs, hackernoon.com och igorsobreira.com
Skriv gärna kommentarer om du hittar något felaktigt eller om du vill dela med dig av mer information om det ämne som diskuteras ovan.
Attention geek! Stärk dina grunder med Python Programming Foundation Course och lär dig grunderna.
För att börja med dina intervjuförberedelser Förbättra dina datastrukturbegrepp med Python DS-kursen.