模塊導入使用import語句,當解釋器執行到import語句時, 若是在搜索路徑中找到了指定的模塊, 就會加載它
該過程遵循LEGB做用域原則, 若是在一個模塊的頂層導入, 那麼它的做用域就是全局的,若是在函數中導入, 那麼它的做用域是局部的
若是模塊是被第一次導入, 它將被加載並執行
當導入多個模塊時,可以使用以下格式:
1) import 模塊1,模塊2,模塊3,...
2) import 模塊1
import 模塊2
import 模塊3
...
以上兩種格式在性能上和生成 Python 字節代碼時沒有什麼不一樣,所以通常狀況下, 使用多行導入,由於可讀性高
以datetime爲例,datetime是一個文件datetime.py,裏面定義了一個叫datetime的類,這個類有一個方法叫作nowsocket
import 模塊
引入模塊datetime,也就是文件datetime.py
當使用該模塊裏的datetime類時,需這樣寫代碼:datetime.datetime
當使用該模塊裏的datetime類的now方法時,需這樣寫代碼:datetime.datetime.now()
注意:當import多個層級時,如import xx.xx.xx,最後的一個xx只能是package或者module,但絕對不能是函數或者類的名字
如:import datatime.datatime 或者 import datatime.datatime.now是不能夠的
import as
有時導入的模塊或是模塊屬性名稱已在程序中使用了, 或不想使用導入的名字
可以使用import as替換成本身想要的名字,一般把模塊賦值給一個變量
如:import datetime as dt
from import
from import用於引入模塊中的類,函數,變量
from datetime import dateti me 表示引入模塊datetime也就是文件datetime.py中的datetime類函數
當使用該模塊裏的datetime類時,需這樣寫代碼:datetime
當使用該模塊裏的datetime類的now()方法時,需這樣寫代碼:datetime.now()
datetime.datetime.now()會報錯,所以經過from import方式導入模塊內容時,若是當前代碼中已有datatime屬性,則屬性就會被覆蓋
而經過import方式就不會,由於import方式是須要"模塊名.屬性"來引用的模塊內容的,所以不會產生衝突
from 模塊 import *
引入模塊中的全部的公開成員,好比有些成員名帶"_"或"__"的,它們是不會被引用的
什麼時候使用from import
1) 目標模塊中的屬性很是多, 反覆鍵入模塊名很不方便 ,
如 Tkinter (Python/Tk) 和 NumPy (Numeric Python) 模塊 , 可能還有 socket 模塊
2) 交互解釋器下, 由於這樣能夠減小輸入次數性能
import和from import區別
假設有模塊A和模塊B,在模塊B中使用import和from import引入模塊A
使用importspa
import A A.funcA() #使用的funcA()依然是A模塊的,雖然在模塊B的代碼中,但其命名空間依然是在模塊A,若是對模塊A的funcA()進行修改,是會影響到其在模塊B的使用的
使用from importcode
from A import funcA funcA() #funcA()已是A模塊的funcA()了,該函數存在於模塊B的全局命名空間,若是對模塊A的funcA()進行修改,是不會影響到其在模塊B的使用的
所以,減小使用from xxx import XXX,特別是from xxx import * 這樣的使用模式。後者將會污染全局命名空間blog