Flask-PyMongo:怎么来“self._Collection__database”?

时间:2012-03-25 04:20:13

标签: python mongodb flask

在Flask-PyMongo中,他们使用self._Collection__database来表示此Collection对象所属的数据库对象:

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__database不是self.__database

test <a>and <i>

1 个答案:

答案 0 :(得分:2)

Flask-PyMongo并不是随意选择这个名字 该名称是name mangling

的结果
  

由于类私有成员有一个有效的用例(即   避免名字冲突的名称与子类定义的名称,在那里   对这种机制的支持是有限的,称为名称修改。任何   __spam形式的标识符(至少两个主要下划线,at   大多数一个尾随下划线)在文本上被替换为   _classname__spam,其中classname是当前的类名,其前导下划线被剥离。

the parent-class definition中,该属性定义为self.__database,Python“修改”名称(到self._ClassName__attributename),以便任何子类不会用自己的赋值覆盖{ {1}}属性。