Python-包
具體的:包就是一個包含有__init__.py文件的文件夾,所以其實我們創建包的目的就是為了用文件夾將文件/模塊組織起來
創建包的目的不是為了運行,而是被導入使用,記住,包只是模塊的一種形式而已,包的本質就是一種模塊
import時導入者不關心是文件夾還是.py;他只知道這是模塊。
import aaa 此處導入的是__init__.py,產生名稱空間也是__init__.py的,而且執行的是__init__.py的源代碼
__init__.py增加變量代碼:
執行文件test:
import aaa print(aaa.x) print(aaa.y) 結果是打印init裏變量的值
也就是說:導入包實際上就是在導入包下面的__init__.py文件
另,import a.b.c.d 導入包才有的語法,點的左邊都是包才行
環境變量就是執行文件的環境變量,固定不變的。
# test.py(執行文件)中 import sys print(sys.path) import aaa # __init__.py中 import sys print(sys.path) # 得到的結果兩個環境變量值都是一樣的,都是執行文件的環境變量
所以在__init__.py中導入m1報錯,因為m1沒有在執行文件的環境變量裏
如果要在執行文件裏拿到m1,所以就要在__init__.py中添加:from aaa import m1 才能讓test文件找到m1
# __init__.py中添加 from aaa.m1 import f1
from aaa.m2 import f2 # m1左邊一定是個包,而且from...import後面是一個明確的名字,不能再加.
test.py中aaa.f1() aaa.f2()執行結果:
from f1 from f2 #因為m1/m2裏面函數f1/f2的代碼就是print(‘from f1‘)/print(‘from f2‘)
aaa下面有加一層bbb,test.py中加入如下代碼
import aaa aaa.bbb # 報錯
要在aaa裏的init中添加from aaa import bbb才行
所以bbb下面的__init__.py就代表了bbb這個包
所以在test.py中可以執行aaa.bbb.x 結果,就是bbb下面的__init__.py裏x變量的值;
再來:
bbb下面init添加
from aaa.bbb import m3 # 在test就可以用到m3 aaa.bbb.m3 # 在test也就可以直接操作m3裏的f3函數 aaa.bbb.m3.f3 直接打印f3內容
那可以直接aaa.f1()嗎?
# 需要去aaa下面的init中添加: from aaa.bbb.m3 import f3
也就是說
# test中 import aaa aaa.f1() aaa.f2() aaa.f3() # 與test在同一目錄的aaa下的init中 from aaa.m1 import f1 from aaa.m2 import f2 from aaa.bbb.m3 import f3 test執行沒問題
#相對目錄表示法: from .m1 import f1 from .m2 import f2 from .bbb.m3 import f3 # .代表當前目錄,下面也有講。
新場景,模塊的開發者在一個模塊中使用自己的另一個模塊
# m3.py中 from aaa.ccc.m4 import f4 def f3(): print(‘f3‘) f4()
以上是絕對路徑,相對路徑如下:
from ..ccc.m4 import f4 def f3(): print(‘f3‘) f4() # .本目錄bbb,..上級目錄aaa
# 一個.就代表從當前目錄找,兩個.就是從上一級目錄找
# .bbb.m3 兩個點意義不一樣。後面的是“子”的意思
如果aaa被放進了一個xxx/yyy的目錄下,test該怎麽找到它呢?
# test中添加新的環境變量 import sys sys.path.append(r‘C:\Users\Administrator\PycharmProjects\python19期\day5\7 包的使用\xxx\yyy‘) import aaa aaa.f1() aaa.f2() aaa.f3() # 即可!
也可以在test文件添加,除非你對包內部很熟悉
from aaa.ccc.m4 import f4 f4() import aaa.ccc.m4 aaa.ccc.m4.f4() # 這個找的過程會觸發每個文件下面的init,但這裏沒有依賴它 不能繼續.f4了,import aaa.ccc.m4.f4 因為f4左邊不是包啦
Python-包