標籤:from 劃線 path code 否則 bsp 清除 one lang
一、模組1.什麼是模組?
常見的情境:一個模組就是一個包含了python定義和聲明的檔案,檔案名稱就是模組名字加上.py的尾碼。
但其實import載入的模組分為四個通用類別:
1 使用python編寫的代碼(.py檔案)
2 已被編譯為共用庫或DLL的C或C++擴充
3 包好一組模組的包
4 使用C編寫並連結到python解譯器的內建模組
2.何要使用模組?
如果你退出python解譯器然後重新進入,那麼你之前定義的函數或者變數都將丟失,因此我們通常將程式寫到檔案中以便永久儲存下來,需要時就通過python test.py方式去執行,此時test.py被稱為指令碼script。
隨著程式的發展,功能越來越多,為了方便管理,我們通常將程式分成一個個的檔案,這樣做程式的結構更清晰,方便管理。這時我們不僅僅可以把這些檔案當做指令碼去執行,還可以把他們當做模組來匯入到其他的模組中。
使用模組可以提高代碼的可維護性和重複使用,還可以避免函數名和變數名衝突。相同名字的函數和變數完全可以分別存在不同的模組中,所以編寫自己的模組時,不必考慮名字會與其他模組衝突,但要注意盡量不要與內建函數名字衝突。
3.模組的匯入方式1.直接匯入
import module
這裡有個大前提,就是你的py執行檔案和模組同屬於同個目錄(父級目錄),如:
- main.py 和 pwcong模組同在python目錄
- 執行檔案為main.py
- pwcong檔案夾為一個模組
我把pwcong模組提供的函數寫在 __init__.py 裡,裡面只提供一個 hi 函數:
# pwcong 模組的 __init__.py# -*- coding: utf-8 -*-def hi(): print("hi")
執行檔案main.py直接import模組:
# main.py# -*- coding: utf-8 -*-import pwcongpwcong.hi()
接著我們運行一下main.py可以看到命令列視窗輸出了一句 hi ,第一種方式完成。
使用模組方式為:先匯入-》接著輸入模組.變數|函數, 如上面例子的 pwcong.hi()
如果要同時匯入多個模組,只需要在模組名之前用逗號進行分隔:
import module1,module2,module3.......
在用import語句匯入模組時最好按照以下的順序:
1、python 標準庫模組
2、python 第三方模組
3、自訂模組
2.import... as...
import 引入模組格式如下:
import 模組路徑.檔案名稱 as 別名
釋:當檔案在目前的目錄下或PATH環境變數下,可以直接import 檔案名稱;否則要從項目根目錄下開始指定路徑。別名,直接引入檔案名稱可以不用別名,如果帶模組路徑引入最好加上別名,使用時直接 【別名. 】使用。
二、from ... import ...
from ... import ... 這種引入方式使用一個點號來標識引入類庫的精確位置。
格式:
import 模組路徑.檔案名稱 import 變數名\函數\類名
from module import xx
from module import xx as rename
from module import *
把my_module中所有的不是以底線(_)開頭的名字都匯入到當前位置,大部分情況下我們的python程式不應該使用這種匯入方式,
因為*你不知道你匯入什麼名字,很有可能會覆蓋掉你之前已經定義的名字。而且可讀性極其的差,在互動式環境中匯入時沒有問題。
*如果module.py中的名字前加_,即_money,則from module import *,則_money不能被匯入
也支援匯入多行
from my_module import (read1, read2, money)
注意:win系統不要使用相對路徑。
模組的載入與修改
考慮到效能的原因,每個模組只被匯入一次,放入字典sys.modules中,如果你改變了模組的內容,你必須重啟程式,python不支援重新載入或卸載之前置入的模組,
有的同學可能會想到直接從sys.modules中刪除一個模組不就可以卸載了嗎,注意了,你刪了sys.modules中的模組對象仍然可能被其他程式的組件所引用,因而不會被清除。
特別的對於我們引用了這個模組中的一個類,用這個類產生了很多個物件,因而這些對象都有關於這個模組的引用。
如果只是你想互動測試的一個模組,使用 importlib.reload(), e.g. import importlib; importlib.reload(modulename),這隻能用於測試環境。
def func1(): print(‘func1‘)
aa.py
import time,importlibimport aa time.sleep(20)# importlib.reload(aa)aa.func1()
測試代碼
在20秒的等待時間裡,修改aa.py中func1的內容,等待test.py的結果。
開啟importlib注釋,重新測試
把模組當做指令碼執行
Python之模組和包