包是模塊的一種形式,包的本質就是一個含有.py的文件的文件夾。
python
模塊的第一個版本只有10個功能,可是將來在擴展版本的時候,模塊名和用法應該最好不要去修改,可是這只是對使用者友好,而因爲版本擴展,文件愈來愈大,模塊設計者對模塊的管理、維護會愈來愈複雜,所以咱們可使用包來擴展模塊的功能。設計
導入模塊發生的三件事:code
1.建立一個包的名稱空間
2.執行py文件,將執行過程當中產生的名字存放於名稱空間中。
3.在當前執行文件中拿到一個名字aaa,aaa是指向包的名稱空間的
導入包發生的三件事:it
1.建立一個包的名稱空間
2.因爲包是一個文件夾,沒法執行包,所以執行包下的.py文件,將執行過程當中產生的名字存放於包名稱空間中(即包名稱空間中存放的名字都是來自於.py)
3.在當前執行文件中拿到一個名字aaa,aaa是指向包的名稱空間的
導入包就是在導入包下的.py,而且可使用如下兩種方式導入:class
1.import ...
2.from ... import...import
以下咱們若是須要擴展aaa.py模塊,須要創建一個aaa的目錄文件,而且刪除aaa.py文件,將aaa.py修改爲m1.py和m2.py兩個文件,讓模塊的功能使用方法不改變。變量
# aaa.py def func1(): pass def func2(): pass def func3(): pass def func4(): pass def func5(): pass def func6(): pass
# m1.py def func1(): pass def func2(): pass def func3(): pass
# m2.py def func4(): pass def func5(): pass def func6(): pass
# run.py import aaa aaa.func1() aaa.func2() aaa.func3() aaa.func4() aaa.func5() aaa.func6()
# aaa/.py func1 = 111 func2 = 222 func3 = 333 func4 = 444 func5 = 555 func6 = 666
因爲在__init__.py中定義了func1,所以咱們能夠在run.py文件中導入func1,可是這個func1並非咱們想要的func1,所以須要修改__init__.py文件,又因爲執行文件run.py的環境變量不爲aaa,所以直接使用import導入m1會報錯,所以使用from導入。擴展
# aaa/.py from aaa.m1 import func1 from aaa.m2 import func2
# run.py import aaa print(aaa.func1()) print(aaa.func2())
# bbb/.py from aaa import bbb
# run.py import aaa print(aaa.bbb)
若是bbb包內部有m3.py,咱們須要從run.py導入m3模塊。語法
# bbb/.py from aaa.bbb import m3
# run.py import aaa aaa.bbb.m3
絕對導入:方法
# aaa/.py from aaa.m1 import func1 from aaa.m2 import func2
對導入:
* .表明當前被導入文件所在的文件夾
* ..表明當前被導入文件所在的文件夾的上一級
* ...表明當前被導入文件所在的文件夾的上一級的上一級
from .m1 import func1 from .m2 import func2
1.包內全部的文件都是被導入使用的,而不是被直接運行的 2.包內部模塊之間的導入可使用絕對導入(以包的根目錄爲基準)與相對導入(以當前被導入的模塊所在的目錄爲基準),推薦使用相對導入 3.當文件是執行文件時,沒法在該文件內用相對導入的語法,只有在文件時被看成模塊導入時,該文件內才能使用相對導入的語法 4.凡是在導入時帶點的,點的左邊都必須是一個包,import aaa.bbb.m3.f3錯誤