模組化是現代程式語言的一大特點,尤其是隨著軟體規模越來越大,按功能分塊開發,便於多個開發人員相互協作,也便於後期維護。
python通過import機制將各模組組織起來。
模組的形式:
模組是乙個以.py結尾的檔案,可以定義變數、方法與類;同時,在模組內可以import進其他模組,如果需要引用其他模組內的變數、方法或物件。
import某一模組,相當於在當前環境中把某塊內的**執行一遍,使得該模組定義的變數、方法可見。為防止名稱衝突,引用時通過模組名.變數名(module.variable)的方式訪問。如果在當前環境中還有同樣名字的變數variable,它們倆之間沒有任何關係,引用時要區分開。
例一:
#t1.py
import t2
print "a variable in t2 is %s" % t2.var_in_t2
print "now will call a function in t2"
print ">>>t2.func_in_t2"
t2.func_in_t2()
#t2.py
var_in_t2 = 0
def func_in_t2():
print "this is a function in t2.py"
print "execution of t2.py"
#執行import t1後的輸出結果
execution of t2.py
a variable in t2 is 0
now will call a function in t2
>>>t2.func_in_t2
this is a function in t2.py
並且import具有層次性質,即在t1中import t2模組,在t1的上一級是不能訪問到t2中的物件的。
>>> t2.var_in_t2
traceback (most recent call last):
file "", line 1, in t2.var_in_t2
nameerror: name 't2' is not defined
#在執行import t1後,在t1中import t2,所以t1中可以訪問t2中的變數,但是在t1之外,例如,全域性環境下試圖訪問t2.var_in_t2,報錯。
從上例中可以看出在t1中建立了乙個命名空間t2,通過這個命名空間,t1可以訪問t2模組中定義的變數和函式。並且這個命名空間只對t1放開的。如果想在全域性環境下使用t2中的物件,必須import t2.
如果使用from ***.py import ***.varorfun,則有所不同,會在當前環境中建立和變數varorfun同名的物件,並且將***.py內的變數賦值給它們,這樣在當前環境中直接訪問該變數了,不需要加模組名。
包一般是目錄,內含python模組或者子目錄,同時一般還包含乙個__init__.py的python檔案,在這個init檔案中初始化首次import package時執行的模組。例如,
package1/ __init__.py
module1.py
module2.py
package2/ __init__.py
module1.py
module2.py
表示乙個包package1,它包含__init__py、module1.py、module2.py,同時包含子目錄package2及其模組。當需要匯入包時,例如import package1,就會執行package1下的__init__.py檔案。如果想在匯入包是做些初始化的工作,例如匯入其他的包等等,都可以在這裡檔案裡寫。其中有個list變數__all__,它包含當執行from package1 import *時匯入的包名,例如__all__ = ["module1", "module2"]。如果只想單獨匯入某個模組,可以這樣:import package1.module1、import package1.package2.module2。
python 模組相互import
模組a中import b,而在模組b中import a。這時會怎麼樣呢?這個在python列表中由robertchen給出了詳細解釋,抄錄如下 a.py from b import d class c pass b.py from a import c class d pass 為什麼執行a的時候不...
python 連環import問題
首先說明一下這是怎樣的乙個問題 結構如圖所示 如下 c.py import src.a b.py print hello a.py import b 此時,我們執行c.py,會報錯 這是為什麼呢?原因在於當前目錄是c.py所在的目錄,而在這個目錄中沒有b.py這個模組。所以,我們該怎麼辦呢?解決的方...
Python 基礎 匯入import
import語句主要有兩種 1 import package.module1,package.module2,2 from package import item 注意當使用 from package import item 這種形式的時候,對應的 item 既可以是包裡面的子模組 子包 或者包裡面...