使用__init__.py

时间:2010-03-02 05:36:24

标签: python module initialization packages

我很难理解项目中python的__init__.py文件的使用场景或设计目标。

假设我有'model'目录(引用为包),其中包含以下文件

  1. __init__.py
  2. meta.py
  3. solrmodel.py
  4. mongomodel.py
  5. samodel.py
  6. 我找到了两种使用__init__.py的方式:

    1. 我有一个共同的定义,需要在solrmodel.pymongomodel.pysamodel.py中使用。我可以使用__init__.py作为所有* model.py类的基本/公共定义吗?这意味着我必须导入model/__init__.py

    2. 或者,__init__.py应该自己导入solrmodel.py,mongomodel.py,samodel.py的定义,它允许轻松导入类或函数,如下所示:

      # file: __init__.py
      
      from mongomodel import *
      from solrmodel import *
      from samodel import *
      

      (我知道不建议使用import *,我只是将其用作惯例)

    3. 我无法决定上述两种情况。是否有__init__.py的更多使用方案,您能解释其用法吗?

2 个答案:

答案 0 :(得分:48)

我写的绝大多数__init__.py文件都是空的,因为许多软件包没有任何要初始化的内容。

我可能想要初始化的一个例子是在包加载时我想一劳永逸地读取一堆数据(比如文件,数据库或网络) - 在这种情况下它是更好地将该读取放在包的__init__.py中的私有函数中,而不是单独的“初始化模块”,并从包中的每个单个实际模块冗余地导入该模块(无用重复)并且容易出错:这显然是一种情况,依赖于语言保证包的__init__.py 在包中的任何模块之前加载一次显然更加Pythonic!)。

对于其他具体和权威的意见表达,请查看作为Python标准库一部分的各种包中采用的不同方法。

答案 1 :(得分:23)

导入包中的模块时,会导入__init__.py的内容。

你忽略了第三个场景,即将公共部分放在一个单独的模块中,然后让其他模块导入,将__init__.py留给将在包外使用的东西。这是我经常遵循的做法。