2012-03-25 10 views
2

In Flask-PyMongo, verwenden sie self._Collection__database das Datenbankobjekt darzustellen, dass diese Sammlung Objekt gehört:Flask-PyMongo: Wie kommt "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 

Warum ist self._Collection__database nicht self.__database?

test <a>and <i> 

Antwort

2

Flask-PyMongo wählt diesen Namen nicht willkürlich.
Der Name das Ergebnis name mangling ist:

Da es ein gültiger Anwendungsfall für private Klassenmitglieder (nämlich zu vermeiden Namenskonflikte von Namen mit den Namen von Unterklassen definierten) ist, gibt es nur begrenzte Unterstützung für einen solchen Mechanismus namens Name Mangling. Jeder Bezeichner des Formulars __spam (mindestens zwei führende Unterstriche, bei am meisten ein abschließender Unterstrich) wird textuell durch _classname__spam ersetzt, wobei Klassenname der aktuelle Klassenname ist, wobei führende Unterstriche entfernt werden.

In the parent-class definition, wird das Attribut definiert als self.__database und Python „verstümmelte“ den Name (zum self._ClassName__attributename), so dass alle Unterklassen nicht mit ihrer eigenen Zuordnung zu ihrem eigenen self.__database Attribute überschreiben.