PROJET AUTOBLOG


Sam & Max: Python, Django, Git et du cul

Site original : Sam & Max: Python, Django, Git et du cul

⇐ retour index

Mise à jour

Mise à jour de la base de données, veuillez patienter...

A propos des attributs préfixés de deux underscores 2

vendredi 3 juillet 2015 à 10:18

En Python, il n’y a pas d’attributs privés au sens propre, uniquement une convention disant que tout ce qu’on préfixe d’un underscore ne fait pas partie de l’API publique.

Cette convention est tellement bien établie que les outils de génération de documentation et de complétion de code la prennent souvent en compte.

Ca fait partie de la philosophie du langage : tout est ouvert. Guido parle même d’open kimono, le petit coquin.

Pourtant il existe une fonctionnalité qui semble rendre un attribut privé, qui est d’utiliser un préfix de DEUX underscores :

class Yo(object):
    def __init__(self):
        self.__bitch = True
>>> Yo().__bitch
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-225402ba2794> in <module>()
----> 1 Yo().__bitch
 
AttributeError: 'Yo' object has no attribute '__bitch'

En fait, l’attribut n’a pas été rendu privé, mais son mécanisme de résolution de nom a été changé :

>>> Yo()._Yo__bitch
    True

C’est ce qu’on appelle le name mangling, et cette obscure fonctionnalité a été utilisée pour s’assurer qu’un attribut ne sera pas écrasé par erreur par une classe enfant.

L’attribut n’est pas privé, il est juste accessible autrement, c’est tout.

Error happened! 0 - count(): Argument #1 ($value) must be of type Countable|array, null given In: /var/www/ecirtam.net/autoblogs/autoblogs/autoblog.php:428 http://ecirtam.net/autoblogs/autoblogs/sametmaxcom_a844ada43a979e3b1395ab9acb6afafb84340999/?A-propos-des-attributs-pr%C3%A9fix%C3%A9s-de-deux-underscores #0 /var/www/ecirtam.net/autoblogs/autoblogs/autoblog.php(999): VroumVroum_Blog->update() #1 /var/www/ecirtam.net/autoblogs/autoblogs/sametmaxcom_a844ada43a979e3b1395ab9acb6afafb84340999/index.php(1): require_once('...') #2 {main}