首页 文章

为什么要在* class *类中设置“private”python属性?

提问于
浏览
6

阅读Django源代码我遇到了this函数 . 它是block标签的实现 .

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

现在我从来没有考虑过使用python name-mangling功能,但这实际上会隐藏 parser__loaded_blocks 属性!要从 parser 方法读取此属性,您必须求助于 getattr(self, "__loaded_blocks") .

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

In general, why would you want to do such a thing?

EDIT: 为了澄清,我尝试从 parser 的方法访问 __loaded_blocks 属性,它将像任何其他属性一样工作,并且它实际上不是一个受损的属性 .

1 回答

  • 3

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

    来自docs

    私有名称修改:当在类定义中以文本方式出现的标识符以两个或多个下划线字符开头并且不以两个或多个下划线结尾时,它被视为该类的私有名称 . 在为它们生成代码之前,将私有名称转换为更长的形式 . 转换在名称前插入类名,删除前导下划线,并在类名前面插入单个下划线 . 例如,名为Ham的类中出现的标识符__spam将转换为Ham_spam . 此转换独立于使用标识符的语法上下文 . 如果转换后的名称非常长(超过255个字符),则可能会发生实现定义的截断 . 如果类名仅包含下划线,则不进行转换 .

    class Test:
      pass
    
    test = Test()
    test.__hello = 'hii'    
    test.__hello  # hiii
    

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

相关问题