例如,在cherryPy
中,有以下文件:
__init__.py
_cptools.py
他们有什么不同?这是什么意思?
答案 0 :(得分:23)
__...__
表示保留的Python 名称(文件名和其他名称)。你不应该使用双下划线表示法发明你自己的名字;如果你使用现有的,它们有特殊的功能。
在这个特定示例中,__init__.py
定义了包的“主”单元;它还会导致Python将特定目录视为包。它是您致电import cherryPy
时使用的单位(cherryPy
是目录)。这在Modules tutorial。
另一个例子是__eq__
方法,它为类提供相等比较。您可以直接调用这些方法(例如,当您使用==
运算符时,可以隐式使用它们);但是,较新的Python版本可能会定义更多此类方法,因此您不应创建自己的__
- 名称,因为它们可能会发生碰撞。您可以在Data model文档中找到这些方法的详细列表。
_...
通常用作“内部”名称。例如,不应直接使用以_
开头的模块;类似地,具有_
的方法被认为是私有的,依此类推。这只是一个惯例,但你应该尊重它。
答案 1 :(得分:13)
这些和其他命名约定在Style Guide for Python Code - Descriptive: Naming Styles
中有详细描述简言之:
__double_leading_and_trailing_underscore__
:生活在用户控制的命名空间中的“魔术”对象或属性。例如__init__
,__import__
或__file__
。不要发明这样的名字;只能按照文件记录使用它们。_single_leading_underscore
:弱“内部使用”指标。例如。 from M import *
不会导入名称以下划线开头的对象。答案 2 :(得分:8)
__init__.py
是一个特殊文件,当存在于文件夹中时会将该文件夹转换为模块。导入模块后,__init__.py
将被执行。另一个只是一个命名约定,但我猜这会说你不应该直接导入该文件。
在这里查看:6.4. Packages,了解如何创建模块。
一般规则:如果Python中的任何内容都是namend __anything__
那么它就是特殊的东西,你应该在使用之前阅读它(例如魔术函数)。
答案 3 :(得分:0)
当前选择的答案已经为__init__.py
的双下划线表示法提供了很好的解释。
我相信文件名中实际上不需要_cptools.py
表示法。。大概是应用Style Guide for Python Code - Descriptive: Naming Styles中的“单个下划线”规则的不必要的扩展用法:
_single_leading_underscore
:“内部使用”指示器较弱。例如。from M import *
不会导入名称以下划线开头的对象。
如果有的话,实际上是使用文件名中的_single_leading_underscore.py
反对。当在C / C ++中实现模块时,其Package and Module Names section仅提及这种用法。
通常,在函数名称,方法名称和成员变量中通常会出现_single_leading_underscore
表示法,以将它们与其他常规方法区分开。
几乎不需要(如果有的话)在文件名上使用_single_leading_underscore.py
,因为开发人员不是报废者,所以他们不太可能根据文件名来保存文件。它们只是遵循程序包的最高级别的API(从技术上来说,其公开实体由__all__
定义),因此,所有文件名甚至都不引人注意,更不用说是文件(即模块)是否是一个因素了。将被使用。