Flask-PyMongo: как получается "self._Collection__database"? - PullRequest
2 голосов
/ 25 марта 2012

В 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__database не self.__database?

test <a>and <i>

1 Ответ

2 голосов
/ 25 марта 2012

Flask-PyMongo не произвольно выбирает это имя.
Имя является результатом искажения имени :

Поскольку существует действительный вариант использования для закрытых членов класса (а именно для избегать столкновений имен с именами, определенными подклассами), там ограничена поддержка такого механизма, называемого искажение имени. любой идентификатор вида __spam (по крайней мере два ведущих символа подчеркивания, в текст, который заменяется на самое нижнее подчеркивание) _classname__spam, где classname - это текущее имя класса с разделителями в начале подчеркивания.

В определении родительского класса атрибут определен как self.__database, и Python «искажает» имя (до self._ClassName__attributename), так что любые подклассы не перезаписываются с их собственным назначением их собственный self.__database атрибут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...