Python 在私有类前面加下划线是一种惯例吗?

Python 在私有类前面加下划线是一种惯例吗?,python,Python,我看到过函数/常量前面加下划线的代码。 我的理解是,这表明它们不能直接使用。 我可以在课堂上这样做吗 class _Foo(object): pass class __Bar(object): pass 对,;对于内部使用类,PEP8支持使用单下划线 我不相信双下划线的用法在大多数情况下都会有任何实际效果,因为它被用来对类属性进行活动名称损坏,并且通常一个类不是另一个类的属性(当然可以,在这种情况下Python会很乐意为您损坏名称)您可以在任何变量中使用一个下划线作为第一个字

我看到过函数/常量前面加下划线的代码。 我的理解是,这表明它们不能直接使用。 我可以在课堂上这样做吗

class _Foo(object):
    pass

class __Bar(object):
    pass

对,;对于内部使用类,PEP8支持使用单下划线


我不相信双下划线的用法在大多数情况下都会有任何实际效果,因为它被用来对类属性进行活动名称损坏,并且通常一个类不是另一个类的属性(当然可以,在这种情况下Python会很乐意为您损坏名称)

您可以在任何变量中使用一个下划线作为第一个字符,但它隐含的含义是,“除非您确实知道自己在做什么,否则不要在类/模块之外使用”(例如,预期的受保护/内部),并且如果您从导入中使用
*
,它将不会导入


使用双下划线是你永远不应该在类之外做的事情,因为它可能会弄乱名称,否则(我的意思是,“可能”在过去的一周里让我非常头疼,因为我没有意识到它确实如此)。

最好只使用一个
。这表示模块中的名称是私有的

它不是从import*导入的catch all
,它还具有一些其他功能,如“首选销毁”

发件人:

如果未定义
\uuuuuuuuuuuuuuuuuuu
,则公共名称集包括所有名称 在模块的命名空间中找到,该命名空间不以下划线开头 字符(“
\
”)

发件人:

从1.5版开始,Python保证名称以 在删除其他全局变量之前,将从其模块中删除单个下划线


双下划线起始类成员是。

是的,这不仅仅是一种约定。当您从此模块导入*
时,将不会导入以下划线开头的名称。

\uuu
由Python保留。永远不要使用这个。在大多数情况下,它会导致名称混乱的问题。尽量避免认为这是有用的。试着认为这是一个“保留”和“不通用”以及“等待发生的问题”。然后,请把它从你的问题中去掉。请解释什么是“私人”类。你能提供一个用例或一个你会使用它的情况吗?将会有用户应该使用的导出函数。在这些函数中,它将实例化这些“私有”类。@guettli“模块迟早需要访问该变量。”Python的好处是,即使在变量前面加下划线,模块仍然可以访问该变量——您只是提供了一个提示,而不是强制执行任何操作。“会有导出的函数吗?”?“导出函数”是什么意思?您似乎使用了许多其他编程语言中的术语。请参见GLGL的答案——只有在未定义
\uuuuuu all\uuuuuu
的情况下才能这样做。如果愿意,您可以在
\uuuuu all\uuuuuu
中包含下划线前缀名称。有人能评论一下“首选销毁”的用途吗?