2012-03-25 1 views
2

Dans Flask-PyMongo, ils utilisent self._Collection__database pour représenter l'objet de base de données que cet objet de collection appartient à:Flask-PyMongo: comment se fait-il "self._Collection__database"?

class Collection(collection.Collection): 
    """Custom sub-class of :class:`pymongo.collection.Collection` which 
    adds Flask-specific helper methods. 
    """ 

    def __getattr__(self, name): 
    attr = super(Collection, self).__getattr__(name) 
    if isinstance(attr, collection.Collection): 
     db = self._Collection__database 
     return Collection(db, attr.name) 
    return attr 

Pourquoi pas self._Collection__databaseself.__database?

test <a>and <i> 

Répondre

2

Flask-PyMongo ne choisit pas arbitrairement ce nom.
Le nom est le résultat de name mangling:

Comme il y a un cas d'utilisation valable pour les membres de la classe-privé (à savoir à conflits de noms d'éviter des noms avec des noms définis par les sous-classes), il est un soutien limité pour un tel mécanisme, appelé nom mangling. Tout identificateur de la forme __spam (au moins deux traits de soulignement principaux, à plus un trait de soulignement) est textuellement remplacé par _classname__spam, où classname est le nom de classe actuel avec le ou les traits de soulignement principaux supprimés.

En the parent-class definition, l'attribut est défini comme self.__database et Python « Mangles » le nom (à self._ClassName__attributename) de sorte que les sous-classes n'écrasent pas leur propre affectation à leur propre attribut self.__database.