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

时间:2012-12-03 14:48:06

标签: python django

阅读Django源代码我遇到了this函数。这是block标记的实现。

我感兴趣的是他们设置了一个带有两个前导下划线(__loaded_blocks)的变量来自 outside parser类实例(解析器是{的一个实例{3}})。 Django源代码中的快速grep显示字符串loaded_blocks仅在此处出现。

现在我从未考虑过使用python名称修改功能,但这实际上会隐藏__loaded_blocks的{​​{1}}属性!要从parser方法中读取此属性,您必须使用parser

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

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

编辑:为了澄清,我完全清楚,只要您不尝试从getattr(self, "__loaded_blocks")的方法访问__loaded_blocks属性,它就会像任何其他属性一样工作,事实上是一个受损的属性。

1 个答案:

答案 0 :(得分:3)

我不认为在将__前缀为class Test: pass test = Test() test.__hello = 'hii' test.__hello # hiii 的属性添加到实例时会发生名称修改

来自docs

  

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

{{1}}

虽然名称没有被破坏,但它仍然将此标记为代码消费者的“私人”