在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.__database不是self._Collection__database
test <a>and <i>发布于 2012-03-25 12:25:20
Flask-PyMongo并不是随意选择这个名字的。
该名称是name mangling的结果
由于类私有成员有一个有效的用例(即避免名称与子类定义的名称之间的名称冲突),因此对这种机制的支持有限,称为名称损坏。任何
__spam形式的标识符(至少两个前导下划线,最多一个尾随下划线)都将以文本形式替换为_classname__spam,其中classname是去掉了前导下划线的当前类名。
在the parent-class definition中,属性被定义为self.__database,Python将名称“损坏”(改为self._ClassName__attributename),这样任何子类都不会用自己对自己的self.__database属性的赋值来覆盖。
https://stackoverflow.com/questions/9857895
复制相似问题