6

阅读 Django 源代码后,我发现了这个函数。这是标签的实现。

令我感兴趣的是,他们从类实例外部设置了一个带有两个前导下划线 ( __loaded_blocks)的变量(解析器是Parser 类的一个实例)。Django 源代码中的快速 grep 显示该字符串仅出现在此处。parserloaded_blocks

现在我以前从未考虑过使用 python 名称修饰功能,但这实际上会隐藏__loaded_blocks属性parser本身!要从parser方法中读取此属性,您必须求助于getattr(self, "__loaded_blocks").

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

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

编辑:澄清一下,我完全知道,只要您不尝试__loaded_blocks从 的方法访问该属性parser,它就会像任何其他属性一样工作,并且它实际上不是一个损坏的属性。

4

1 回答 1

3

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

来自文档

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

class Test:
  pass

test = Test()
test.__hello = 'hii'    
test.__hello  # hiii

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

于 2012-12-03T14:57:16.367 回答