Подчеркивает проблему в искажении имени из документов Частные переменные - PullRequest
0 голосов
/ 13 апреля 2019

Docs-> 9.Classes-> 9.6 Private Variables

Следующие строки (строки 3 до 5) имеют для меня нулевой смысл:

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

Если classname является текущим классом, почему он говорит с ведущимподчеркивания раздели ?В тексте все видят, что элемент _classname__spam имеет перед ним подчеркивание.

EDIT

Каким-то образом должен быть классимена с ведущими символами подчеркивания, такими как __Welcome, но в учебных материалах я всегда приводил примеры вроде:

class NamingNow:
    pass

... без подчеркиваний.Однако когда я использую функцию dir, я получаю что-то вроде

>>> dir(Mapping)
['_Mapping__update', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'update']

Относится ли это правило к этой вещи __class__?

1 Ответ

3 голосов
/ 13 апреля 2019

Это говорит о том, что если само имя класса содержит начальные подчеркивания, они будут удалены, но всегда будет добавляться еще одно подчеркивание. Таким образом, класс с именем _MyClass будет иметь атрибуты, помеченные как _MyClass_spam, а не __MyClass_spam.

...