在eclipse中用pydev開發Python腳本時,我遇到了一個這樣的現象,當我新建一個pydev package時,總會自動地生成一個空的__init__.py文件,由於是python新手,因此很不瞭解這個空文件的做用是什麼,由於沒有什麼東西可寫在這裏,因此我直接把這個文件給刪掉了,結果個人包圖標自動變爲文件夾圖標了,這是怎麼回事呢!python
原來在python模塊的每個包中,都有一個__init__.py文件(這個文件定義了包的屬性和方法)而後是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那麼它就是這個包的子包了。當你將一個包做爲模塊導入(好比從 xml導入 dom )的時候,實際上導入了它的 __init__.py 文件。dom
一個包是一個帶有特殊文件 __init__.py 的目錄。__init__.py 文件定義了包的屬性和方法。其實它能夠什麼也不定義;能夠只是一個空文件,可是必須存在。若是 __init__.py 不存在,這個目錄就僅僅是一個目錄,而不是一個包,它就不能被導入或者包含其它的模塊和嵌套包。eclipse
_init__.py 文件:
__init__.py 控制着包的導入行爲。假如 __init__.py 爲空,那麼僅僅導入包是什麼都作不了的。ide
>>> import Package1
>>> Package1.Module1
Traceback (most recent call last):
File "D:/Work Space/Python practice/MyPractice/src/test.py", line 8, in <module>
aa=Package1.Module1
AttributeError: 'module' object has no attribute 'Module1'
咱們須要在 __init__.py 裏把 Module1 預先導入:測試
#文件 __init__.py
import Module1
測試:xml
>>> import Package1
>>> aa=Package1.Module1
>>> print aa
__init__.py 中還有一個重要的變量,叫作 __all__。咱們有時會使出一招「所有導入」,也就是這樣:blog
from PackageName import *
這時 import 就會把註冊在包 __init__.py 文件中 __all__ 列表中的子模塊和子包導入到當前做用域中來。好比:ip
#文件 __init__.py
__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]
測試:作用域
>>> from Package1 import *
>>>開發
test1111111111111111111111
test222222
__init__.py 文件會在導入時被執行。