Python模塊包(pycharm右鍵創建文件夾和python package的區別)中__init__.py文件的作用


 

在eclipse中用pydev開發Python腳本時,我遇到了一個這樣的現象,當我新建一個pydev package時,總會自動地生成一個空的__init__.py文件,因為是python新手,所以很不了解這個空文件的作用是什么,因為沒有什么東西可寫在這里,所以我直接把這個文件給刪掉了,結果我的包圖標自動變為文件夾圖標了,這是怎么回事呢!

 

 

 

原來在python模塊的每一個包中,都有一個__init__.py文件(這個文件定義了包的屬性和方法)然后是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那么它就是這個包的子包了。當你將一個包作為模塊導入(比如從 xml導入 dom )的時候,實際上導入了它的 __init__.py 文件。

 

一個包是一個帶有特殊文件 __init__.py 的目錄。__init__.py 文件定義了包的屬性和方法。其實它可以什么也不定義;可以只是一個空文件,但是必須存在。如果 __init__.py 不存在,這個目錄就僅僅是一個目錄,而不是一個包,它就不能被導入或者包含其它的模塊和嵌套包。

 

 

 

 

 

_init__.py 文件:

__init__.py 控制着包的導入行為。假如 __init__.py 為空,那么僅僅導入包是什么都做不了的。

 

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

測試

>>> import Package1
>>> aa=Package1.Module1
>>> print aa

__init__.py 中還有一個重要的變量,叫做 __all__。我們有時會使出一招“全部導入”,也就是這樣:

from PackageName import *

這時 import 就會把注冊在包 __init__.py 文件中 __all__ 列表中的子模塊和子包導入到當前作用域中來。比如:

#文件 __init__.py
__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]

測試:

>>> from Package1 import *

>>>

 

test1111111111111111111111
test222222

__init__.py 文件會在導入時被執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM