Python模塊包中__init__.py文件的作用

用django做開發已經一年多的時間,但基本沒注意python模塊中__init__.py文件存在的意義,偶然看到對它的介紹嚇一大跳,這個文件太重要了

模塊包:

包通常總是一個目錄,目錄下爲首的一個文件便是 __init__.py。然後是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那麼它就是這個包的子包了。差不多就像這樣吧:

Package1/ __init__.py    Module1.py    Module2.py    Package2/ __init__.py       Module1.py       Module2.py
我們可以就這樣導入一個包:

import Package1
或者調入一個子模塊和子包:

from Package1 import Module1from Package1 import Package2import Packag1.Module1import Packag1.Package2
可以深入好幾層包結構:

from Package1.Package2 import Module1import Package1.Package2.Module1
大致就這樣吧,我覺得,包的精髓應該是在 __init__.py 這個文件之中的。


__init__.py 文件:

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

>>> import Package1>>> Package1.Module1Traceback (most recent call last): File "<pyshell#1>", line 1, in ?  Package1.Module1AttributeError: 'module' object has no attribute 'Module1'
我們需要在 __init__.py 裏把 Module1 預先導入:

#文件 __init__.pyimport Module1
測試:

>>> import Package1>>> Package1.Module1<module 'Package1.Module1' from 'Module.pyc'>
__init__.py 中還有一個重要的變量,叫做 __all__。我們有時會使出一招“全部導入”,也就是這樣:

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

#文件 __init__.py__all__ = ['Module1', 'Module2', 'Package2']
測試:

>>> from Package1 import *>>> Module2<module 'Package1.Module2' from 'Module.pyc'>
__init__.py 文件會在導入時被執行。
發佈了36 篇原創文章 · 獲贊 6 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章