酒壯熊人膽
兩杯紅酒下肚,乘興便打開這個盒子 —— import。
衆所周知,import 也許是 Python 中最平淡無奇、最道貌岸然的東西了。它總是用一種呆滯木然的眼神看着身懷絕技的道友們玩出各種花招、翻雲覆雨,卻從來是不動聲色……這卻越來越像是一個陰謀了!
曾經,我也在江湖上聽說過 import,它似乎是 Python 的基本語句,用於導入包(Package),或者模塊(Module)到當前的作用域裏來,這樣我們就可以在程序中調用這些包和模塊了。好象還真沒見它做過什麼出格的事情來呢。
通常模塊是後綴爲 ".py"、".pyo"、".pyc"、".pyd"、".so"、".dll" 這樣的文件。啊哈,導入模塊還是挺簡單的,就連我這種初學者都爛熟於心咯。只是那個 Package……
包
包通常總是一個目錄,目錄下爲首的一個文件便是 __init__.py。然後是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那麼它就是這個包的子包了。差不多就像這樣吧:
Package1/ __init__.py
Module1.py
Module2.py
Package2/ __init__.py
Module1.py
Module2.py
我們可以就這樣導入一個包:
import Package1
或者調入一個子模塊和子包:
from Package1 import Module1
from Package1 import Package2
import Packag1.Module1
import Packag1.Package2
可以深入好幾層包結構:
from Package1.Package2 import Module1
import Package1.Package2.Module1
大致就這樣吧,我覺得,包的精髓應該是在 __init__.py 這個文件之中的。
__init__.py 文件
__init__.py 控制着包的導入行爲。假如 __init__.py 爲空,那麼僅僅導入包是什麼都做不了的。
>>> import Package1
>>> Package1.Module1
Traceback (most recent call last): File "<pyshell#1>", line 1, in ? Package1.Module1
AttributeError: 'module' object has no attribute 'Module1'
我們需要在 __init__.py 裏把 Module1 預先導入:
#文件 __init__.py
import Module1
測試:
>>> import Package1
>>> Package1.Module1
<module 'Package1.Module1' from 'Module.pyc'>
__init__.py 中還有一個重要的變量,叫做 __all__。我們有時會使出一招“全部導入”,也就是這樣:
from Package1 import *
這時 import 就會把註冊在包 __init__.py 文件中 __all__ 列表中的子模塊和子包導入到當前作用域中來。比如:
#文件 __init__.py
__all__ = ['Module1', 'Module2', 'Package2']
測試:
>>> from Package1 import *
>>> Module2
<module 'Package1.Module2' from 'Module.pyc'>
__init__.py 文件會在導入時被執行。