模块导入,包导入
模塊與包
模塊與包二
模塊導入
?import導入模塊具體原理:
先從sys.modules里查看該模塊名是否存在,已經被導入
如果沒有被導入,則當前執行文件目錄為準,依據sys.path里的路徑尋找模塊名
找不到模塊名則報錯,找到模塊后,就為這個模塊創建命名空間
把該模塊的變量,函數名都存放在該命名空間里
?
import...as...
作用:導入模塊并給模塊重命名
它的一種用法:
db_type=input('>>: ') if db_type == 'mysql':import mysql as db elif db_type == 'oracle':import oracle as dbdb.update()
?
模塊導入注意事項:
模塊最好分多行導入
先導入內置模塊,再導入擴展模塊,最后是自己寫的模塊
?
from...import...:單獨從一個模塊里導入一個函數或者變量
?
from...import... 與 import的區別:
from...import...會把函數或者變量名導入到當前命名空間里,可能會覆蓋當前命名空間里已存在的命名,而import會給模塊創建單獨的命名空間,不會沖突
from...import...只會導入一兩個變量名,而import會把模塊里所有變量,函數加載到命名空間里,浪費內存
from...import...里函數還是會引用原來模塊里的變量,因為變量實際上就是一個內存地址
?
from...import*:把模塊里所有變量,函數導入到當前模塊命名空間,一般不推薦用
在導入模塊文件時,__all__與from...import* 與搭配使用才會生效,__all__ = ['read', money],它限制from...import*可以導入的變量名和函數名(不適用__all__變量時,from...import*會導入所有變量和函數名)?
?
需求:當一個文件的功能需要單獨調試時,不希望帶著其他文件的代碼一起運行,而又不希望修改這個文件的代碼。
__name__ 用法:
當文件被當做一個腳本去執行,?__name__ = '__main__
當文件被當做一個模塊被導入時,?__name__=‘當前模塊的名字’
if __name__ == '__main__':(加了這一句后,就不用在單獨調試模塊時,需要寫調用函數的代碼,作為模塊,就得刪掉這些調用語句了)執行代碼
?
?
包導入
解釋:單獨一個模塊文件已經不能滿足功能需求了,需要增加更多的代碼,但是也不能一直寫在一個文件里。所以,把一些模塊文件集中起來放在一個文件夾里,稱為一個包。
?
from...import...使用原則:
(所有)凡是在導入時帶點的,點的左邊都必須是一個包。在導入后就沒有這個限制了,包,模塊,函數,類都可以直接用點的方式調用自己屬性
from...import...:import后帶的不可以帶點,必須是一個單獨的包、模塊。錯誤用法:from a import b.c
?
使用import 導入包(from...import...沒有這個問題,不需要處理__init__文件),會執行__init__文件下的代碼。通常,包的__init__文件都未作處理,需要在每個__init__下寫入導入語句,使得下面代碼可以執行正確
#在glance.__init__.py中 from .api.policy import get from .api.versions import create_resourcefrom .cmd.manage import main from .db.models import register_models__all__=['get','create_resource','main','register_models']
import glance glance.cmd.manage.main()
??
在使用import和from...import...前,一定要弄明白當前文件是被當做腳本執行的還是被當做模塊被其他文件導入的。原因:執行腳本所在的目錄決定了sys.path差異,因此,使用import時,會出現找不到模塊的現象。
?
相對導入和絕對導入
絕對導入:
相對導入:只出現在包里,如果包里有相對導入了,就不能用絕對導入了。
原因:導入一個包時,sys.path確定,當前執行目錄已經知曉,導入內存中時,根據相對導入建立一個包的關系樹。當用包里的模塊當做腳本執行了,sys.path發生改變,相對導入(./..)失去作用,不在內存里,找不到目錄關系。(表現為:只能向里層方向找,不能向外層方向找,絕對導入也是不可以從里層往外層方向找的)
所以,相對導入是在執行腳本所在目錄(sys.path)確定后為前提情況,因此,用相對導入寫的包,里面的模塊文件就不能單獨執行了。from . import a 這種語法在腳本文件里是錯誤的。
?
相對路徑和絕對路徑的優缺點
絕對路徑 :
不管在包內部還是外部 導入了就能用
不能挪動,但是直觀
相對路徑:
可以隨意移動包 只要能找到包的位置,就可以使用包里的模塊
包里的模塊如果想使用其它模塊的內容只能使用相對路徑,使用了相對路徑就不能在包內直接執行了
通常情況,只需要在包外部調用包的模塊,不需要去單獨執行包里面模塊文件的話(通常是已經成型的包),不管包里面的模塊是如何相互調用的,使用相對路徑
?
轉載于:https://www.cnblogs.com/liyuexi/p/10726447.html
總結
- 上一篇: 一般洗牙多少钱啊?
- 下一篇: 关于“樱花”的唯美古风句子有哪些?