从docs私有变量中强调名称处理中的下划线问题

时间:2019-04-13 12:16:39

标签: python class name-mangling

Docs->9.Classes->9.6 Private Variables

以下几行(第3行到第5行)对我来说意义为零:

  

因为有一个针对类私有成员的有效用例(即   避免名称与子类定义的名称发生名称冲突),   对这种称为名称修改的机制的支持有限。任何   __spam格式的标识符(至少两个前划线,在   大部分结尾的下划线)在文字上被替换为   _classname__spam,其中classname是当前的类名,其中前导下划线被去除。这种处理是无视的   只要标识符出现在标识符的句法位置上   在类的定义之内。

如果班级名称是当前班级,为什么会说前导下划线被删除?在文本中,每个人都可以看到元素_classname__spam 在其前面带有下划线。

编辑

以某种方式应该有带下划线的类名,如__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 个答案:

答案 0 :(得分:3)

这就是说,如果类名本身包含前导下划线,则会将它们删除,但始终会在下划线前加上下划线。因此,名为_MyClass的类会将属性修饰为_MyClass_spam,而不是__MyClass_spam