GeeksforGeeks
Prequisito: Underscore in Python
In Python, non esistono variabili di istanza “private” a cui non si può accedere se non all’interno di un oggetto. Tuttavia, una convenzione viene seguita dalla maggior parte del codice Python e dai codificatori, cioè, un nome preceduto da un trattino basso, per esempio _geek dovrebbe essere trattato come una parte non pubblica dell’API o di qualsiasi codice Python, che sia una funzione, un metodo o un membro dei dati. Mentre ci occupiamo di questo cercheremo anche di capire il concetto di varie forme di trattino basso, per esempio, for _ in range(10), __init__(self).
Mangling e come funziona
In Python, c’è qualcosa chiamato name mangling, che significa che c’è un supporto limitato per un caso d’uso valido per i membri privati delle classi, fondamentalmente per evitare scontri di nomi con nomi definiti da sottoclassi. Qualsiasi identificatore della forma __geek (almeno due trattini bassi iniziali o al massimo un trattino basso finale) viene sostituito con _classname__geek, dove classname è il nome della classe corrente con un trattino basso iniziale. Finché avviene all’interno della definizione della classe, questa manipolazione viene fatta. Questo è utile per permettere alle sottoclassi di sovrascrivere i metodi senza interrompere le chiamate ai metodi intraclasse.
Guardiamo questo esempio e cerchiamo di capire come funziona questa sottolineatura:
Le regole di mangling sono progettate principalmente per evitare incidenti, ma è ancora possibile accedere o modificare una variabile che è considerata privata. Questo può anche essere utile in circostanze speciali, come nel debugger.
Single Leading Underscores
Fondamentalmente una sottolineatura all’inizio di un metodo, funzione o membro di dati significa che non si dovrebbe accedere a questo metodo perché non fa parte delle API. Guardiamo questo frammento di codice:
Il frammento è preso dal codice sorgente di Django (django/forms/forms.py). Questo suggerisce che errors è una proprietà, ed è anche una parte dell’API, ma il metodo, _get_errors, è “privato”, quindi non si dovrebbe accedervi.
__Double Leading Underscores
Due sottolineature, all’inizio, causano molta confusione. Si tratta di sintassi piuttosto che di una convenzione. Il doppio trattino basso maciullerà i nomi degli attributi di una classe per evitare conflitti di nomi di attributi tra le classi. Per esempio:
__Double leading and Double trailing underscores__
C’è un altro caso di doppio underscore iniziale e finale. Lo seguiamo mentre usiamo variabili speciali o metodi (chiamati “metodo magico”) come__len__, __init__. Questi metodi forniscono speciali caratteristiche sintattiche ai nomi. Per esempio, __file__ indica la posizione del file Python, __eq__ viene eseguito quando viene eseguita l’espressione a == b.
Esempio:
class
Geek:
def
__init__(
self
, ab):
self
.ab
=
ab
def
__custom__(
self
):
pass
This article is contributed by Chinmoy Lenka. Se ti piace GeeksforGeeks e vuoi contribuire, puoi anche scrivere un articolo usando contribute.geeksforgeeks.org o spedire il tuo articolo a [email protected]. Vedi il tuo articolo apparire sulla pagina principale di GeeksforGeeks e aiuta altri Geek.
Ho fatto riferimento a Python Docs, hackernoon.com e igorsobreira.com
Si prega di scrivere commenti se trovate qualcosa di sbagliato, o volete condividere ulteriori informazioni sull’argomento discusso sopra.
Attenzione geek! Rafforza le tue fondamenta con il corso Python Programming Foundation e impara le basi.
Per cominciare, la tua preparazione al colloquio Migliora i tuoi concetti di Data Structures con il corso Python DS.