【问题标题】:Flask-PyMongo: how come "self._Collection__database"?Flask-PyMongo:“self._Collection__database”怎么来的?
【发布时间】:2012-04-09 02:47:52
【问题描述】:

在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>

【问题讨论】:

    标签: python mongodb flask


    【解决方案1】:

    Flask-PyMongo 并非随意选择该名称。
    名字是name mangling的结果:

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

    the parent-class definition 中,属性定义为self.__database,Python 将名称“修改”为self._ClassName__attributename,这样任何子类都不会用自己的self.__database 属性赋值覆盖。

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 2015-03-30
      • 2016-06-05
      • 1970-01-01
      • 2020-07-21
      • 2018-12-10
      • 2015-02-25
      • 2013-05-28
      • 2018-02-27
      相关资源
      最近更新 更多