使用__init__.py

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

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

  1. __init__.py
  2. meta.py
  3. solrmodel.py
  4. mongomodel.py
  5. samodel.py

我find了两种使用__init__.py

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

  2. 或者, __init__.py init__.py应该自己导入solrmodel.py,mongomodel.py,samodel.py的定义,并且允许像这样轻松导入类或函数:

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

    (我知道,不推荐import * ,我只是用它作为约定)

我无法决定以上两种情况。 __init__.py有更多的使用场景,你能解释一下使用情况吗?

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

我可能想要初始化的一个例子是,在包加载的时候,我想一次性读取大量数据(从文件,数据库或者网页中读取) – 在这种情况下,把这个阅读放在包的__init__.py中的一个私有函数中,而不是有一个单独的“初始化模块”,并且从包中的每一个真实模块中冗余地导入该模块(无用的重复和容易出错:显然是依赖在语言的保证,该包的__init__.py 加载一次之前在包中的任何模块明显更Pythonic!)。

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

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

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