Наследование Python и вызывающий конструктора родительского класса

Они полностью отличающиеся . is проверки на объектные идентификационные данные, в то время как == проверки на равенство (понятие, которое зависит от типов этих двух операндов).

Это - только удачное совпадение, которое" is", кажется, работает правильно с маленькими целыми числами (например, 5 == 4+1). Это вызвано тем, что CPython оптимизирует устройство хранения данных целых чисел в диапазоне (-5 к 256) путем создания их одиночными элементами . Это поведение является полностью зависящим от реализации и не гарантировало, что было сохранено под всем способом незначительных поддающихся трансформации операций.

, Например, Python 3.5 также делает короткие строковые одиночные элементы, но разрезание их разрушает это поведение:

>>> "foo" + "bar" == "foobar"
True
>>> "foo" + "bar" is "foobar"
True
>>> "foo"[:] + "bar" == "foobar"
True
>>> "foo"[:] + "bar" is "foobar"
False

14
задан goh 5 December 2011 в 06:37
поделиться

3 ответа

Из документации python:

Изменение частного имени: когда идентификатор, который текстуально встречается в определении класса , начинается с двух или более символов подчеркивания и не заканчивается двумя или более подчеркиваний, оно считается частным именем этого класса. Частные имена преобразуются в более длинную форму , прежде чем для них будет создан код. Преобразование вставляет имя класса перед именем , с удалением ведущих подчеркиваний и вставкой одного подчеркивания перед именем класса. Например, идентификатор __ spam , встречающийся в классе с именем Ham , будет преобразован в _Ham__spam . Это преобразование не зависит от синтаксического контекста, в котором используется идентификатор. Если преобразованное имя очень длинное (более 255 символов), может произойти усечение, определяемое реализацией. Если имя класса состоит только из символов подчеркивания, преобразование не выполняется.

Таким образом, ваш атрибут называется не __ test , а _BaseClass__test .

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

_test , и большинство разработчиков Python будут знать, что атрибут является внутренней частью класса, а не публичным интерфейсом.

_test , и большинство разработчиков Python будут знать, что атрибут является внутренней частью класса, а не публичным интерфейсом.

20
ответ дан 1 December 2019 в 09:33
поделиться

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

Используйте один знак подчеркивания, если вы хотите, чтобы ваш атрибут считался частным другими разработчиками.

3
ответ дан 1 December 2019 в 09:33
поделиться

Вы можете использовать средства самоанализа Python, чтобы получить информацию, которую вы ищете. Простой dir (test) даст вам

['_BaseClass__test', '__doc__', '__init__', '__module__', 'doSomething']

Обратите внимание на '_BaseClass__test'. Это то, что вы ищете.

За дополнительной информацией обращайтесь к здесь .

5
ответ дан 1 December 2019 в 09:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: