Comme la plupart des langages, Python
possède le concept d'éléments privées :
- des fonctions privées, qui ne peuvent être appelées de l'extérieur de leur module ;
- des méthodes de classe privées, qui ne peuvent être appelées de l'extérieur de leur classe ;
- des attributs privés, qui ne peuvent être accédé de l'extérieur de leur classe.
Contrairement à la plupart des langages, le caractère privé ou public d'une fonction, d'une méthode ou d'un attribut est déterminé
en Python entièrement par son nom.
Si le nom d'une fonction, d'une méthode de classe ou d'un
attribut commence par (mais ne se termine pas par) deux caractères de
soulignement il s'agit d'un élément privé, tout le reste est
public. Python ne possède pas de concept de méthode protégée (accessible seulement à la même classe ou a ses descendants). Les méthodes d'une classe sont ou privées (accessibles seulement
à la même classe) ou publiques (accessibles à tout le monde).
MP3FileInfo a deux méthodes :
__parse et __setitem__. Comme
nous en avons déjà discuté, __setitem__ est une
méthode
spéciale, vous l'appelez normalement indirectement en utilisant
la syntaxe de dictionnaire sur une instance de classe, mais elle est
publique et vous pouvez l'appeler directement (même d'en dehors du
module fileinfo) si vous avez
une bonne raison de le faire. Par contre __parse
est privée, car elle a deux caractères de soulignement au début de son
nom.
 |
| En Python, toutes les méthodes
spéciales (comme __setitem__)
et les attributs prédéfinis (comme __doc__) suivent
une convention standard : il commencent et se terminent par deux
caractères de soulignement. Ne nommez pas vos propres méthodes et
attributs de cette manière, cela n'apporterait que de la confusion
pour vous et les autres.
|
Exemple 5.19. Tentative d'appel d'une méthode privée
>>> import fileinfo
>>> m = fileinfo.MP3FileInfo()
>>> m.__parse("/music/_singles/kairo.mp3")
Traceback (innermost last):
File "<interactive input>", line 1, in ?
AttributeError: 'MP3FileInfo' instance has no attribute '__parse'
|
Si vous essayez d'appeler une méthode privée,
Python lévera une exception un peu
trompeuse disant que la méthode n'existe pas. Bien sûr elle
existe, mais elle est privée, donc elle n'est pas accessible d'en
dehors de la classe. A proprement parler, les méthodes privées sont
accessibles d'en dehors de leur classe, mais pas
facilement accessibles. Rien n'est
vraiment privé en Python, en
interne les noms des méthodes et attributs privés sont
camouflés à la volée pour les rendre inaccessibles par leur
nom d'origine. Vous pouvez accéder à la méthode
__parse de la classe
MP3FileInfo par le nom
_MP3FileInfo__parse. Vous êtes prié de
trouver ça intéressant mais de promettre de ne jamais, jamais
l'utiliser dans votre code. Les méthodes privées ont une bonne
raison de l'être, mais comme beaucoup d'autres choses en
Python, leur caractère privé est en
dernière instance une question de convention et non
d'obligation.
|
Pour en savoir plus sur les fonctions privées