为什么我会把Python代码放在​​__init__.py文件中

我正在寻找什么types的代码将放在__init__.py文件和什么是与此有关的最佳做法。 或者,这是一个不好的做法?

任何参考已知的文件,解释这一点也非常感谢。

库和框架通常在__init__.py文件中使用初始化代码来整齐地隐藏内部结构并为用户提供统一的接口。

我们以Django表单模块为例。 表单模块中的各种function和类根据其分类定义在不同的文件中。

 forms/ __init__.py extras/ ... fields.py forms.py widgets.py ... 

现在,如果你要创build一个表单,你将不得不知道每个函数在哪个文件中被定义,并且创build一个联系表单的代码将不得不看起来像这样(这是不方便和丑陋的)。

  class CommentForm(forms.forms.Form): name = forms.fields.CharField() url = forms.fields.URLField() comment = forms.fields.CharField(widget=forms.widgets.Textarea) 

相反,在Django中,您可以直接从表单命名空间中引用各种小部件,表单,字段等。

 from django import forms class CommentForm(forms.Form): name = forms.CharField() url = forms.URLField() comment = forms.CharField(widget=forms.Textarea) 

这怎么可能? 为了使这成为可能,Django将以下语句添加到forms/__init__.py文件中,该文件将所有的小部件,窗体,字段等导入到forms名称空间中。

 from widgets import * from fields import * from forms import * from models import * 

正如你所看到的,这在创build表单时简化了你的生活,因为现在你不必担心每个函数/类在哪里定义,只需要直接从forms命名空间使用所有这些。 这只是一个例子,但是您可以在其他框架和库中看到类似的例子。

该领域的最佳实践之一是从你的图书馆中导入所有需要的类(例如,看mongoengine )。 所以,你的图书馆的用户可以这样做:

 from coollibrary import OneClass, SecondClass 

代替

 from coollibrary.package import OneClass from coollibrary.anotherpackage import SecondClass 

另外,好的做法是在__init__.py版本常量中包含

  1. 为了方便:其他用户不需要知道你的function的确切位置。

     your_package/ __init__.py file1.py/ file2.py/ ... fileN.py # in __init__.py from file1 import * from file2 import * ... from fileN import * # in file1.py def add(): pass 

    那么其他人可以通过调用add()

     from your_package import add 

    不知道file1就好

     from your_package.file1 import add 
  2. 把东西进行初始化。 例如,日志logging(这应该放在顶层):

     import logging.config logging.config.dictConfig(Your_logging_config)