2011-09-30 49 views
7

我看到代码中的函数/常量前缀为下划线。 我的理解是,这表明他们不能直接使用。 我可以用类来做到这一点吗?这是一个约定前缀私人类与下划线?

class _Foo(object): 
    pass 

class __Bar(object): 
    pass 
+3

'__'由Python保留。永远不要使用这个。这在大多数情况下会导致名称混乱的问题。尽量避免认为这是有用的。试着将其看作是“保留”和“不是一般用途”和“等待发生的问题”。然后,请把它从你的问题中拿出来。 –

+0

请解释一下“私人”课程可能是什么。你能提供一个用例或者你会使用它的情况吗? –

+0

将会出现用户应该使用的导出函数。在这些函数中,它将实例化这些“私有”类。 – canadadry

回答

6

最好只使用一个_。这表明名称在模块内是私有的。

它不是全部引入from <module> import *,它还有一些其他功能,如“首选销毁”。

here

如果__all__没有定义,一组公开的名字包括模块的名称空间中的所有名称 不以下划线 字符开头(“_”)。

here

与1.5版本开始,Python的保证全局名字始于 单下划线从该模块中被删除其他全局被删除之前。

双下划线起始类成员是name-mangled

5

是; PEP8认可单用于下划线的内部使用类。

我不认为双重下划线的使用在大多数情况下都会有实际的效果,因为它用于为类属性主动命名修饰,并且通常一个类不是另一个类的属性(授予它, 可以是,在这种情况下Python会愉快地裂伤你的名字。)

2

您可以使用一个下划线作为任何变量的第一个字符,但它承载的寓意,“不使用外班级/模块,除非你真的知道自己在做什么“(例如,预期的受保护/内部),并且如果使用from <module> import *则不会导入。

使用双下划线是你永远不应该在班级以外做的事情,因为它可能会混淆名称否则(和“可以”,我的意思是“过去一周让我很头痛,因为我没有意识到它确实“)。

2

是的,这不仅是一个约定。当您从该模块登录import *时,不会导入以下划线开头的名称。

+1

查看glglgl的答案 - 只有在没有定义'__all__'的情况下。如果需要,你可以在你的'__all__'中包含下划线前缀名。 – agf

相关问题