Are*_*Tor 8 python naming-conventions private-members
好吧我想我已经理解在Python中使用一个和两个标题下划线了.
如果我错了,纠正我,
在一个下划线的情况下,下划线阻止from X import *语句导入此类变量.
在两个下划线的情况下,变量的名称前面加上它所属的类的名称,以允许更高级别的"私有性".
我现在的问题是:为什么不只使用两个下划线?在哪种情况下,两个下划线优先(或需要)一个下划线?
bru*_*ers 16
简短回答:使用单个前导下划线,除非你有一个非常令人信服的理由不这样做(甚至再三思).
答案很长:
一个下划线表示"这是一个实现细节"(属性,方法,函数,等等),并且是Java中"受保护"的Python等价物.这是您应该用于不属于您的类/模块/包公共API的名称的内容.这只是一个命名约定(主要是 - 明星导入会忽略它们,但你不会在其他任何地方进行明星导入,而不是在你的Python shell中吗?)所以它不会阻止任何人访问这个名字,但他们'如果有任何问题,请自行解决(请将此视为"保密无效,如果未密封"的提及).
两个下划线触发名称修改机制.很少有正当理由使用它 - 实际上只有我能想到的(并且记录在案):保护名称不会在复杂框架的内部环境中被意外覆盖.作为一个例子,在整个django代码库中可能有大约六个或更少这个命名方案的实例(主要在django.utils.functional包中).
就我而言,我必须在15年以上使用这个功能三次,即便如此,我仍然不确定我是否真的需要它.
查看文档。
\n\n1. 单下划线
\n\n来自PEP-8:
\n\n\n\n\n_single_leading_underscore:弱“内部使用”指示符。例如,
\nfrom M import *不导入名称以下划线开头的对象。
2. 双下划线:
\n\n来自 Python教程:
\n\n\n\n任何形式的标识符
\n__spam(至少两个前导下划线,至多一个尾随下划线)在文本上都替换为_classname__spam,其中classname是删除了前导下划线的当前类名。这种修改是在不考虑标识符的语法位置的情况下完成的,因此它可以用于定义类私有实例和类变量、方法、存储在全局变量中的变量,甚至存储在实例中的变量。其他类的实例上的此类是私有的。\n 名称修饰的目的是为类提供一种简单的方法来定义 \xe2\x80\x9cprivate\xe2\x80\x9d 实例变量和方法,而不必担心派生类定义的实例变量,或通过代码破坏实例变量课外。请注意,损坏规则主要是为了避免事故而设计的;对于一个坚定的灵魂来说,仍然有可能访问或修改被认为是私有的变量。
| 归档时间: |
|
| 查看次数: |
2256 次 |
| 最近记录: |