在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>
答案 0 :(得分:2)
Flask-PyMongo并不是随意选择这个名字 该名称是name mangling:
的结果由于类私有成员有一个有效的用例(即 避免名字冲突的名称与子类定义的名称,在那里 对这种机制的支持是有限的,称为名称修改。任何
__spam
形式的标识符(至少两个主要下划线,at 大多数一个尾随下划线)在文本上被替换为_classname__spam
,其中classname是当前的类名,其前导下划线被剥离。
在the parent-class definition中,该属性定义为self.__database
,Python“修改”名称(到self._ClassName__attributename
),以便任何子类不会用自己的赋值覆盖{ {1}}属性。