2012-03-25 29 views
2

在燒瓶PyMongo,他們使用self._Collection__database表示,這個集合對象所屬的數據庫對象:Flask-PyMongo:怎麼來「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 

爲什麼self._Collection__databaseself.__database

test <a>and <i> 

回答

2

Flask-PyMongo並非任意選擇該名稱。
名稱是的name mangling結果:

由於存在一個有效的用例爲類私有成員(即人名的具有名稱 避免名稱衝突由子類所定義的),有 是有限的支持對於這樣的機制,稱爲名稱修改。任何 表格__spam的標識符(至少兩個前導下劃線,在 最後一個尾部下劃線)被文本替換爲 _classname__spam,其中classname是帶有前導下劃線的當前類名稱。

the parent-class definition,屬性定義爲self.__database和Python「軋液」的名稱(以self._ClassName__attributename),以便任何子類不與自己分配給自己的self.__database屬性覆蓋。