“为什么设置?”;“私人”;类*外部*的python属性?
阅读Django源代码时,我遇到了函数。这是标签的实现 我感兴趣的是,他们在“为什么设置?”;“私人”;类*外部*的python属性?,python,django,Python,Django,阅读Django源代码时,我遇到了函数。这是标签的实现 我感兴趣的是,他们在解析器类实例(解析器是。Django源代码中的快速grep显示字符串loaded_blocks仅出现在此处 现在,我以前从未考虑过使用python名称混乱特性,但这实际上会隐藏解析器的属性加载的块!要从解析器方法中读取此属性,必须求助于getattr(self,“\uu-loaded\u-blocks”) 我认为这只是所选属性名的一个意外和未使用的副作用,对吗?还是有更深层次的目的 一般来说,你为什么要做这样的事? 编辑
解析器
类实例(解析器是。Django源代码中的快速grep显示字符串loaded_blocks
仅出现在此处
现在,我以前从未考虑过使用python名称混乱特性,但这实际上会隐藏解析器的属性加载的块!要从解析器
方法中读取此属性,必须求助于getattr(self,“\uu-loaded\u-blocks”)
我认为这只是所选属性名的一个意外和未使用的副作用,对吗?还是有更深层次的目的
一般来说,你为什么要做这样的事?
编辑:为了澄清,我完全知道,只要您不尝试从解析器的方法访问\uu loaded\u blocks
属性,它将与任何其他属性一样工作,并且它实际上不是一个损坏的属性 我不认为在实例中添加前缀为\uuuu
的属性时会发生名称损坏
从:
私有名称损坏:当一个标识符以文本形式出现在
类定义以两个或多个下划线字符和
不以两个或多个下划线结尾,它被认为是私有的
那个班级的名字。私有名称被转换为更长的形式
在为它们生成代码之前。转换将插入
名称前面的类名,删除前导下划线,以及
在类名前面插入一个下划线。例如
在名为Ham的类中出现的标识符\uuu垃圾邮件将
转化为火腿肉。此转换独立于
使用标识符的语法上下文。如果
转换后的名称非常长(超过255个字符),
可能发生实现定义的截断。如果类名
只包含下划线,不进行任何转换
虽然名称没有损坏,但对代码使用者来说,它仍然将其标记为“私有”哦,我意识到了这一点。但是如果您在Test
中创建了一个方法,该方法在设置后打印\uuuu hello
属性,它将无法打印,因为它实际上会尝试打印\uu Test\uuuuu hello
属性。正如我所说,这种方法必须使用getattr
来打印外部设置的\uu hello
属性。@lazyr oo是的,我明白你现在说的了!他们不是从方法中读取它,如果他们这样做了,我打赌他们不会创建带有双下划线的变量……没有目的,DJango只是有难看的代码。
class Test:
pass
test = Test()
test.__hello = 'hii'
test.__hello # hiii