2011-04-29 49 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) 
    
相關問題