由于存在对于类私有成员的有效使用场景(例如避免名称与子类所定义的名称相冲突),因此存在对此种机制的有限支持,称为 名称改写。 任何形式为 spam
的标识符(至少带有两个前缀下划线,至多一个后缀下划线)的文本将被替换为 _classname
spam
,其中 classname
为去除了前缀下划线的当前类名称。 这种改写不考虑标识符的句法位置,只要它出现在类定义内部就会进行。
上面的示例即使在 MappingSubclass
引入了一个 标识符的情况下也不会出错,因为它会在 Mapping
类中被替换为 _Mapping
update
而在 MappingSubclass
类中被替换为 _MappingSubclass__update
。
请注意传递给 或 eval()
的代码不会将发起调用类的类名视作当前类;这类似于 global
语句的效果,因此这种效果仅限于同时经过字节码编译的代码。 同样的限制也适用于 getattr()
, setattr()
和 delattr()
,以及对于 的直接引用。