【发布时间】:2018-08-13 07:33:10
【问题描述】:
对于一个项目,我不得不从 C++ 切换到 python,但我在完全理解 __init__.py 文件时遇到了一些麻烦。我在__init__.py 文件中找到了以下文档:
- https://docs.python.org/3/tutorial/modules.html
- https://www.pythoncentral.io/how-to-create-a-python-package/
- http://mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html
为了更熟悉__init__.py 文件的工作方式,我在python 2.7 和3.6.5 中都做了一些测试。为此,我使用了“PythonCentral”测试包(参见链接 2):
现在我了解__init__.py 文件的以下内容:
-
__init__.py文件在导入模块或子包模块时执行。 -
__init__.py可用于重载包__all__方法。 -
__init__.py可用于定义导入顺序 -
__init__.py可用于使类在包和子包级别可用。
使用我的主文件范围内的不同模块和类似乎按照文档中的说明进行。但是,当尝试使用在另一个子包模块中定义的类时,我遇到了麻烦。在 python 2.7 中,在 subanimals 子包中创建了以下__init__.py 文件:
from Mammals import Mammals
print "subpackage __init__.py executed"
我在 Bird.py 模块中创建了以下代码:
class Birds:
def __init__(self):
''' Constructor for this class. '''
# Create some member animals
self.members = ['Sparrow', 'Robin', 'Duck']
def printMembers(self):
print('Printing members of the Birds class')
for member in self.members:
print('\t%s ' % member)
test = Mammals()
test.printMembers
在运行以下主脚本时:
from animals.subanimals import Birds
test = Birds()
test.printMembers()
我不断收到未定义的全局名称 Mammals。我可以在 python 2.7 中通过将 from Mammals import Mammals 添加到 Birds.py 的顶部来解决这个问题。
__init__.py 是否仅在主脚本的范围级别导入包和类,因此不在 Birds.py 模块内,还是我做错了什么?
【问题讨论】:
-
每个单独的文件必须单独有效,定义所有适当的导入。
__init__.py用于将目录中的多个文件聚合到一个模块中;将其视为分组并将属性 up 传递给父级,而不是 down 到该目录中的其他文件。 -
我看不到你在哪里导入 Mammals,将 from Mammals import Mammals 添加到 Birds.py 中,也请避免在子目录中以相同的方式命名文件,这只会增加混乱和不必要的行为。跨度>
-
@jonrsharpe 啊所以如果我理解正确,init.py 文件仅适用于我上面描述的功能,不能以与 C++ 头文件类似的方式使用被使用?因此,在 python 中,我必须在所有 py 文件中定义所有导入?
-
@simoneZandara 是的,我试过了,这解决了错误,但我想知道是否可以将 _init_.py 用作某种头文件(相当于C++),我可以在其中指定我所有的包导入。从您和 jonrscharpe 的评论来看,这似乎是不可能的。
-
@jonrsharpe 也非常感谢您改进了我的问题的格式,我将在我提出的其他问题中使用您的风格。
标签: python python-2.7 python-import