阅读Django源代码我遇到了this函数。这是block标记的实现。
我感兴趣的是他们设置了一个带有两个前导下划线(__loaded_blocks
)的变量来自 outside parser
类实例(解析器是{的一个实例{3}})。 Django源代码中的快速grep显示字符串loaded_blocks
仅在此处出现。
现在我从未考虑过使用python名称修改功能,但这实际上会隐藏__loaded_blocks
的{{1}}属性!要从parser
方法中读取此属性,您必须使用parser
。
我认为这只是所选属性名称的无意和未使用的副作用吗?或者是否有更深层次的目的?
一般来说,你为什么要做这样的事情?
编辑:为了澄清,我完全清楚,只要您不尝试从getattr(self, "__loaded_blocks")
的方法访问__loaded_blocks
属性,它就会像任何其他属性一样工作,事实上不是一个受损的属性。
答案 0 :(得分:3)
我不认为在将__
前缀为class Test:
pass
test = Test()
test.__hello = 'hii'
test.__hello # hiii
的属性添加到实例时会发生名称修改
来自docs:
私有名称修改:当在文本中出现的标识符时 类定义以两个或多个下划线字符开头 不会以两个或多个下划线结尾,它被认为是私人的 该类的名称。私人名称将转换为更长的形式 在为它们生成代码之前。转换插入 名称前面的类名,删除了前导下划线,以及 在类名前面插入一个下划线。例如, 名为Ham的类中出现的标识符__spam将是 转化为 Ham _spam。这种转变独立于 使用标识符的语法上下文。如果 转换后的名称非常长(超过255个字符), 实现定义截断可能发生。如果是班级名称 仅由下划线组成,不进行任何转换。
{{1}}
虽然名称没有被破坏,但它仍然将此标记为代码消费者的“私人”