1. 程式人生 > >Python-包

Python-包

一級目錄 tor 路徑 end rom 相對 意義 裏的 內容

具體的:包就是一個包含有__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(rC:\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-包