Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“为什么设置?”;“私人”;类*外部*的python属性?_Python_Django - Fatal编程技术网

“为什么设置?”;“私人”;类*外部*的python属性?

“为什么设置?”;“私人”;类*外部*的python属性?,python,django,Python,Django,阅读Django源代码时,我遇到了函数。这是标签的实现 我感兴趣的是,他们在解析器类实例(解析器是。Django源代码中的快速grep显示字符串loaded_blocks仅出现在此处 现在,我以前从未考虑过使用python名称混乱特性,但这实际上会隐藏解析器的属性加载的块!要从解析器方法中读取此属性,必须求助于getattr(self,“\uu-loaded\u-blocks”) 我认为这只是所选属性名的一个意外和未使用的副作用,对吗?还是有更深层次的目的 一般来说,你为什么要做这样的事? 编辑

阅读Django源代码时,我遇到了函数。这是标签的实现

我感兴趣的是,他们在
解析器
类实例(解析器是。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