2011-04-29 94 views
55

我正在寻找__init__.py文件中的什么类型的代码,以及与此相关的最佳实践。或者,一般来说这是一种不好的做法吗?为什么我会在__init__.py文件中放入python代码

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

+2

的可能重复(http://stackoverflow.com/questions/448271/what [什么是__init__.py?] -is-INIT-PY-为) – Aamir 2011-04-29 11:01:34

回答

7

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

from coollibrary import OneClass, SecondClass 

代替

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

而且,比较好的做法是包括__init__.py版本的常

49

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

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

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

现在,如果你要创建一个表单,你必须知道在哪个文件中的每个函数的定义,你的代码来创建一个接触的形式将不得不是这个样子(这是incovenient和丑陋) 。

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
  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 
    

    然后其他人可以通过

    from your_package import add 
    

    调用add()不知道文件1,像

    from your_package.file1 import add 
    
  2. 把一些初始化。例如,日志记录(这应该放在顶层):

    import logging.config 
    logging.config.dictConfig(Your_logging_config) 
    
相关问题