使用 __init__.py

Posted

技术标签:

【中文标题】使用 __init__.py【英文标题】:using __init__.py 【发布时间】:2011-01-22 14:22:20 【问题描述】:

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

假设我有一个包含以下文件的“模型”目录(称为包)

    __init__.py meta.py solrmodel.py mongomodel.py samodel.py

我找到了两种使用__init__.py的方法:

    我有一个共同的定义,需要在solrmodel.pymongomodel.pysamodel.py 中使用。我可以使用__init__.py 作为所有 *model.py 类的基本/通用定义吗?这意味着我必须导入model/__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 约定吗? 使用反引号将其放入代码块中,如下所示:`__init__.py`。或者对 __init__.py 使用 \ like \\_\\_init\\_\\_.py。下划线用于斜体。 【参考方案1】:

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

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

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

【讨论】:

Pylons 建议将模型放在 init.py 中。可以吗?这真的会以这种方式初始化模型吗? 就我个人而言,我宁愿不要在__init__.py 中添加大量代码,但没有理由避免它——这纯粹是一种风格选择。该文件中的所有代码都会在您第一次导入包或包中的任何模块时执行。 我有一个关于 Django 视图中的全局变量的问题。可以请提供您的意见吗? ***.com/questions/39490843/django-app-level-variables【参考方案2】:

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

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

【讨论】:

我不太明白。您能否提供第三种情况的示例? @Tyler Long,他的意思是有一个单独的初始化模块(例如 bootstrap 并在包的 __init__.py 中调用 import bootstrap

以上是关于使用 __init__.py的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Django 应用程序需要 `manage.py` 而不是使用 `__init__ py`?

即使使用 __init__.py,如何修复“尝试在非包中进行相对导入”

如何在(子)模块中使用 __init__.py 来定义命名空间?

8.1包,__init__.py,

为什么Django应用程序需要`manage.py`而不是使用`__init__py`?

我可以使用 __init__.py 来定义全局变量吗?