为什么要在__ init__. py 文件中放入代码?

我在寻找什么类型的代码,我会把在 __init__.py文件和什么是最佳做法相关的。或者,总的来说这是一种不好的做法?

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

18642 次浏览

这方面的最佳实践之一是从库中导入所有需要的类(例如,看看 Mongoengine)。因此,库的用户可以这样做:

from coollibrary import OneClass, SecondClass

而不是

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

此外,良好的做法是包括在 __init__.py版本常数

库和框架通常在 __init__.py文件 巧妙地隐藏内部结构,为用户提供统一的界面中使用初始化代码。

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

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

现在,如果要创建表单,您必须知道每个函数在哪个文件中定义,并且创建联系人表单的代码必须类似于下面这样(这样做既不方便又难看)。

 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 *

正如您所看到的,这简化了创建表单时的工作,因为现在您不必担心每个函数/类的定义位置,只需直接从 forms名称空间使用所有这些函数/类。这只是一个示例,但您可以在其他框架和库中看到类似的示例。

  1. 为了方便起见: 其他用户不需要知道您的功能的确切位置。

    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 () by

    from your_package import add
    

    在不知道文件的情况下,比如

    from your_package.file1 import add
    
  2. Put something for initializing. For example, the logging(this should put in the top level):

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