包__init__.py文件中定义的导入范围是什么?

时间:2018-08-13 07:33:11

标签: python python-2.7 python-import

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

为了更加熟悉__init__.py文件的工作方式,我在python 2.7和3.6.5中都进行了一些测试。我为此使用了“ PythonCentral”测试包(请参见链接2):

package overview

现在,我了解有关__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()

我一直没有得到哺乳动物的全局名称。我可以在python 2.7中解决此问题,方法是从“哺乳动物”中添加“导入哺乳动物”到Birds.py的顶部。

__init__.py是否仅在主脚本的作用域级别上导入包和类,因此不导入Birds.py模块内部,还是我做错了其他事情?

1 个答案:

答案 0 :(得分:0)

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

  

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