Как / почему это работает в python?rover._Dog__password () - PullRequest
3 голосов
/ 15 января 2012

Я делаю Python Koan (для Python 2.6) и обнаружил нечто, чего я не понимаю. Один из файлов имеет следующий код в строке 160:

class Dog(object):
    def __password(self):
        return 'password'

Это

rover = Dog()
password = rover.__password()

приводит к AttributeError. Это ясно для меня. (__password(self) - это какой-то частный метод из-за двух первых подчеркиваний).

Но это

rover._Dog__password()

для меня загадка. Может кто-нибудь объяснить мне, как или почему это работает, или лучше указать мне документы, где это описано?

Ответы [ 2 ]

7 голосов
/ 15 января 2012

Двойное подчеркивание:

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

Поэтому, когда вы звоните на __methodname, это точно звонок на _classname__methodname. В результате получается AttributeError

Одно подчеркивание:

Переменные в классе с начальным подчеркиванием просто указывают другим программистам, что переменная должна быть закрытой. Однако с самой переменной ничего особенного не делается.

Документация Python здесь:

Документация по частным переменным Python

Полный пост найден здесь:

Что означает одиночное и двойное подчеркивание перед именем объекта?

0 голосов
/ 15 января 2012

Python выполняет сортировку имен методов, которые начинаются с двойного подчеркивания, так что получается так, как вы видите выше.Это предотвращает конфликты имен в иерархиях наследования, но не мешает программисту напрямую вызывать искаженное имя.

...