模組,import,from xxx
- 2020 年 1 月 23 日
- 筆記
一,模組
模組就是一個包含了python定義和聲明的文件,文件名就是模組的名字加上.py後綴,總體來說,import載入的模組一共分成四個通用的類別:
1,使用python編寫的py文件
2,已被變異為共享或者DLL或者C++的擴展
3,包好一組模組的包
4,使用c編寫並連接到python解釋器的內置模組
為什麼要使用模組?為了我們寫的程式碼可以重用不至於把所有的程式碼都寫在一個文件內,當項目規模比較小的時候,完全可以使用一個py搞定整個項目的開發,但是如果是一個非常大的項目,此時就必須要把相關的功能進行分離,方便我們日常維護,以及新項目的開發,導入模組有兩種方式:
1,import 模組
2,from xxx import xxx
二,import
首先建一個tang.py文件。
name='糖糖' def xihuan(): print('%s喜歡看小說'%name) print('她喜歡畫畫') print('她喜歡喝冰紅茶') print('她喜歡吃胡豆') xihuan()
接下來,再建一個py文件,在這個文件中導入tang模組。
import tang #此時運行新建的py文件時,會默認執行tang模組中的程式碼 import tang #不管後面調用幾次,都是沒有效果的,模組是不能夠重複導入的 import tang print(tang.name) tang.xihuan() #在引入模組後,就可以調用tang模組中的屬性和方法
導入模組的時候都做了些什麼?首先,在導入模組的一瞬間,python解釋器會先通過sys.mudules來判斷該模組是否已經導入過了,如果導入過了就不在導入,如果該模組還沒導入過,則系統會做三件事:
1,為導入的模組創立新的名稱空間
2,在新創建的名稱空間中運行該模組中的程式碼
3,創建模組的名字,並使用該名稱作為該模組在當前模組中引用的名字
注意:由於模組在導入的時候會創建自己的名稱空間,所以,我們在使用模組中的變數的時候一般是不會產生衝突的。
import tang name='糖兒' tang.xihuan() #結果還是用的是tang中的『糖糖』
注意:在模組中使用global,我們之前說global表示把全局的內容引入進到局部,但是,這個全局指的是py文件,換句話說,global指向的是模組內部,並不會改變外部模組的內容
tang.py name='糖糖' def xihuan(): global name name='糖糖糖' print(name) 111.py import tang name='唐兒' tang.xihuan() #結果是『糖糖糖』 print(name) #結果是『唐兒』
特別要注意,如果我們在不同的模組中引入同一個模組,並且在某一個模組中改變了被引入模組中的全局變數,則其他模組看到的值也隨之改變,原因是python的模組只會引入一次,大家共享同一個名稱空間
tang.py name='糖' 111.py import tang tang.name='糖糖' #if __name__ == __main__: 此時,只有在111py文件為執行文件時才會改變值 #tang.name='糖糖』 112.py import tang import 111 print(tang.name) #結果是『糖糖』 113.py import tang import 111 #print(tang.name) #而此時,結果就不在是『糖糖』,而是『糖』
我們可以對引入的模組重新命名,還可以一次性引入多個模組
import tang as t print(t.name) #這樣也行的 import time,random,json,tang #一次引入多個,但引入的順序是有規定的
正確的導入模組的順序:
1,所有的模組導入都要寫在最上面,這是最基本的
2,先引入內置模組
3,在引入擴展模組
4,最後引入自定義的模組
三,from xxx import xxx
其實就是選擇性的導入
tang.py name='糖糖' def xihuan(): print('%s喜歡看小說'%name) print('她喜歡畫畫') print('她喜歡喝冰紅茶') print('她喜歡吃胡豆') xihuan() from tang import xihuan xihuan() #直接使用就可以,不用tang.
但是這有個坑,當我們從一個模組中引入一個變數的時候,如果當前文件中出現了重名的變數時,會覆蓋掉模組中引入的那個變數。
tang.py name='糖糖' def xihuan(): print('%s喜歡看小說'%name) print('她喜歡畫畫') print('她喜歡喝冰紅茶') print('她喜歡吃胡豆') xihuan() from tang import name name='靜靜' print(name) #此時結果是『靜靜』
所以,不要重名,切記,不要重名!不僅僅是變數名不要重複,我們創建的py文件的名字不要和系統內置的模組重名,否則,引入的模組都是python內置的模組。
還有一種特殊的寫法,from xxx import *,此時也是把模組中的所有內容導入。注意:如果所導的模組中沒有寫__all__則默認所有內容導入,但如果寫了__all__,此時導入的內容就是__all__列表中列出來的所有名字
tang.py __all__=['name'] name='糖糖' def xihuan(): print('%s喜歡看小說'%name) print('她喜歡畫畫') print('她喜歡喝冰紅茶') print('她喜歡吃胡豆') www.py from tang import * print(name) #結果是『糖糖』 xihuan() #報錯