模塊基礎-07包

一丶什麼是包

包是模塊的一種形式,包的本質就是一個含有.py的文件的文件夾。

python

二丶爲何要有包

模塊的第一個版本只有10個功能,可是將來在擴展版本的時候,模塊名和用法應該最好不要去修改,可是這只是對使用者友好,而因爲版本擴展,文件愈來愈大,模塊設計者對模塊的管理、維護會愈來愈複雜,所以咱們可使用包來擴展模塊的功能。設計


三丶如何用包

3.1 模塊和包

導入模塊發生的三件事:code

 1.建立一個包的名稱空間
 2.執行py文件,將執行過程當中產生的名字存放於名稱空間中。
 3.在當前執行文件中拿到一個名字aaa,aaa是指向包的名稱空間的
導入包發生的三件事:it

 1.建立一個包的名稱空間
 2.因爲包是一個文件夾,沒法執行包,所以執行包下的.py文件,將執行過程當中產生的名字存放於包名稱空間中(即包名稱空間中存放的名字都是來自於.py)
 3.在當前執行文件中拿到一個名字aaa,aaa是指向包的名稱空間的
導入包就是在導入包下的.py,而且可使用如下兩種方式導入:class

 1.import ...
 2.from ... import...import

3.2擴展模塊功能

以下咱們若是須要擴展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()

3.3 修改__init__.py文件

# 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())

3.4 導入包內包

# bbb/.py

from aaa import bbb
# run.py
import aaa

print(aaa.bbb)

3.5 導入包內包的模塊

若是bbb包內部有m3.py,咱們須要從run.py導入m3模塊。語法

# bbb/.py

from aaa.bbb import m3
# run.py

import aaa

aaa.bbb.m3

3.6 絕對導入和相對導入

絕對導入:方法

# 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錯誤

相關文章
相關標籤/搜索