为什么要从*outside*the class中设置"private"python属性?

Lau*_*low 6 python django

阅读Django源代码我发现了这个功能.这是标记的实现.

我感兴趣的是,他们设置变量有两个前导下划线(__loaded_blocks)从外面parser类实例(解析器是实例解析类).Django源代码中的快速grep显示字符串loaded_blocks仅在此处出现.

现在我从来没有考虑过使用python name-mangling功能,但这实际上会隐藏自身的__loaded_blocks属性parser!要从parser您必须求助的方法中读取此属性getattr(self, "__loaded_blocks").

我是否正确地认为这只是所选属性名称的无意和未使用的副作用?或者是否有更深层次的目的?

一般来说,你为什么要做这样的事情?

编辑:为了澄清,我完全清楚,只要你不尝试__loaded_blocks从方法中访问属性parser,它就会像任何其他属性一样工作,并且它实际上不是一个受损的属性.

dm0*_*514 3

__我认为当您向实例添加前缀为 的属性时,不会发生名称修改

来自文档

私有名称修改:当类定义中文本出现的标识符以两个或多个下划线字符开头且不以两个或多个下划线结尾时,它被视为该类的私有名称。在为其生成代码之前,私有名称会转换为更长的形式。该转换将类名插入到名称前面,删除前导下划线,并在类名前面插入一个下划线。例如,名为 Ham 的类中出现的标识符 __spam 将被转换为Ham _spam。此转换独立于使用标识符的语法上下文。如果转换后的名称非常长(超过 255 个字符),则可能会发生实现定义的截断。如果类名仅包含下划线,则不进行任何转换。

class Test:
  pass

test = Test()
test.__hello = 'hii'    
test.__hello  # hiii
Run Code Online (Sandbox Code Playgroud)

尽管名称没有被破坏,但它仍然对代码的使用者标记为“私有”