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__
这件事有关?
答案 0 :(得分:3)
这就是说,如果类名本身包含前导下划线,则会将它们删除,但始终会在下划线前加上下划线。因此,名为_MyClass
的类会将属性修饰为_MyClass_spam
,而不是__MyClass_spam
。