package
一個(gè)package 被導(dǎo)入,不管在什么時(shí)候__init__.py的代碼都只會(huì)被執(zhí)行一次
__init__.py內(nèi)的導(dǎo)入順序
- __init__.py 文件內(nèi)變量
- 是不是package內(nèi)的subpackage
- 是不是package內(nèi)的module
simple_package已經(jīng)被成功導(dǎo)入,但是a.py和b.py并沒有被導(dǎo)入
第一種就是在init.py內(nèi)導(dǎo)入a或者b模塊扶叉,然后保存再激活python的交互環(huán)境第二辦法就是手動(dòng)導(dǎo)入词身,當(dāng)你想使用模塊a中的bar()函數(shù)時(shí)雏婶,需要手動(dòng)導(dǎo)入
例子
sound
|-- effects
| |-- echo.py
| |-- __init__.py
| |-- reverse.py
| `-- surround.py
|-- filters
| |-- equalizer.py
| |-- __init__.py
| |-- karaoke.py
| `-- vocoder.py
|-- formats
| |-- aiffread.py
| |-- aiffwrite.py
| |-- auread.py
| |-- auwrite.py
| |-- __init__.py
| |-- wavread.py
| `-- wavwrite.py
`-- __init__.py
如果你希望python幫你自動(dòng)導(dǎo)入sound.effects你可以往sound目錄下的__init__.py文件寫入
"""An empty sound package
This is the sound package, providing hardly anything!"""
import sound.effects
print("sound package is getting imported!")
除了使用絕對(duì)路徑你可以使用相對(duì)路徑來導(dǎo)入sound.effects
這跟linux的命令行比較像辕翰,.代表當(dāng)前目錄培遵,..代表上級(jí)目錄
"""An empty sound package
This is the sound package, providing hardly anything!"""
from . import effects
print("sound package is getting imported!")
__all__
我們嘗試使用*來進(jìn)行全部的導(dǎo)入
>>> from sound import *
sound package is getting imported!
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
我們可以使用__all__這個(gè)魔法變量來手動(dòng)導(dǎo)入模塊和子package浪藻,當(dāng)你定義了all到init.py文件以后捐迫,python會(huì)根據(jù)你在list內(nèi)給出的元素進(jìn)行逐個(gè)導(dǎo)入
__all__ = ["formats", "filters", "effects"]
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'effects', 'filters', 'formats']
>>>
package 總結(jié)
- 在 from package import * 語(yǔ)句中,如果 __init__.py 中定義了 __all__魔法變量爱葵,那么在__all__內(nèi)的所有元素都會(huì)被作為模塊自動(dòng)被導(dǎo)入(ImportError任然會(huì)出現(xiàn)施戴,如果自動(dòng)導(dǎo)入的模塊不存在的話)。
- 如果 __init__.py 中沒有 __all__ 變量萌丈,導(dǎo)出將按照以下規(guī)則執(zhí)行:
** 此 package 被導(dǎo)入赞哗,并且執(zhí)行 __init__.py 中可被執(zhí)行的代碼
** __init__py 中定義的 variable 被導(dǎo)入
** __init__.py 中被顯式導(dǎo)入的 module 被導(dǎo)入
反射
反射包
#__init__.py
from . import c
In [6]: import test2
In [7]: getattr(test2,'c').c_f()
b
134
In [3]: import importlib
In [4]: importlib.import_module('test2')
Out[4]: <module 'test2' from '/Users/shilulu/PycharmProjects/geotool/test2/__init__.py'>
In [5]: test2 = importlib.import_module('test2')
In [6]: test2.c.b()
b
In [7]: getattr(test2,'c').c_f()
b
134
反射模塊
In [9]: c = importlib.import_module('c')
In [10]: c.c_f()
b
134