4.9. Funzioni private

Come molti linguaggi, anche Python ha il concetto di funzioni private, che non possono essere chiamate dall'esterno del loro modulo; metodi privati di una classe, che non possono essere chiamati dall'esterno della loro classe ed attributi privati, che non possono essere referenziati dall'esterno della loro classe. Al contrario di molti linguaggi, il fatto che una funzione, metodo o attributo in Python sia pubblico o privato viene determinato interamente dal suo nome.

In MP3FileInfo vi sono due metodi: __parse e __setitem__. Come abbiamo già detto, __setitem__ è un metodo speciale; normalmente, lo chiamereste indirettamente usando la sintassi del dizionario su un'istanza di classe ma è pubblico e potreste chiamarlo direttamente (anche dall'esterno del modulo fileinfo) se avete una buona ragione. Comunque, __parse è privato, visto che ha due underscore all'inizio del suo nome.

Nota
Se il nome di una funzione, metodo di classe o attributo in Python inizia con (ma non finisce con) due underscore, è privato; ogni altra cosa è pubblica.
Nota
In Python, tutti i metodi speciali (come __setitem__) e gli attributi built-in (come __doc__) seguono una convenzione standard sui nomi: iniziano e finiscono con due underscore. Non nominate i vostri metodi e attributi in questa maniera, servirà solo a confondervi. Inoltre, in futuro, potrebbe anche confondere altri che leggeranno il vostro codice.
Nota
Python non ha il concetto di metodi protetti di classe (accessibili solo nella loro stessa classe ed in quelle discendenti). I metodi di classe sono o privati (accessibili unicamente nella loro stessa classe) o pubblici (accessibili ovunque).

Esempio 4.20. Provare ad invocare un metodo privato

>>> import fileinfo
>>> m = fileinfo.MP3FileInfo()
>>> m.__parse("/music/_singles/kairo.mp3") 1
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
AttributeError: 'MP3FileInfo' instance has no attribute '__parse'
1 Se provate a chiamare un metodo privato, Python solleverà un'eccezione un po' ingannevole, dicendo che il metodo non esiste. Ovviamente esiste, ma è privato, quindi non accessibile al di fuori della classe. [5]

Ulteriori letture

Footnotes

[5] Parlando rigorosamente, i metodi privati sono accessibili al di fuori dalla loro classe, ma non facilmente. Nulla in Python è realmente privato, internamente i nomi dei metodi e degli attributi privati vengono cambiati al volo per farli sembrare inaccessibili attraverso i nomi che li identificano. Potete accedere al metodo __parse della classe MP3FileInfo con il nome _MP3FileInfo__parse. Ammesso che sia interessante, promettete di non farlo mai e poi mai nel codice reale. I metodi privati sono tali per una ragione, ma come per altre cose in Python, se sono privati è soprattutto per una questione di convezioni, non di imposizione.