【问题标题】:What is the scope of imports defined in the package __init__.py file?包 __init__.py 文件中定义的导入范围是什么?
【发布时间】:2018-08-13 07:33:10
【问题描述】:

对于一个项目,我不得不从 C++ 切换到 python,但我在完全理解 __init__.py 文件时遇到了一些麻烦。我在__init__.py 文件中找到了以下文档:

为了更熟悉__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


【解决方案1】:

我的问题的答案可以在@jonrsharpe 的评论中找到。

每个单独的文件必须单独有效,定义所有 适当的进口。 init.py 用于聚合多个文件 一个目录到一个模块中;将其视为分组和传递 属性取决于父级,而不是其他文件 目录。

【讨论】:

    猜你喜欢
    • 2018-01-13
    • 1970-01-01
    • 2017-07-25
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 2014-08-04
    相关资源
    最近更新 更多