import 初探之一 —— 導入 Package

酒壯熊人膽
        兩杯紅酒下肚,乘興便打開這個盒子 —— 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 文件會在導入時被執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章