首頁  >  文章  >  後端開發  >  python中包是什麼?有什麼作用? python中包的介紹

python中包是什麼?有什麼作用? python中包的介紹

不言
不言轉載
2018-11-20 16:10:577522瀏覽

這篇文章帶給大家的內容是關於python中包是什麼?有什麼作用? python中包的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

1.什麼是套件?

套件是一種透過".模組名稱"來組織python模組名稱空間的方式.我們穿件的每個資料夾都可以被稱為包.

但是要注意, 在python2中規定. 包內必須存在__init__.py檔.

創建包的目的不是為了運行, 而是被導入使用. 包只是一種形式而已,包的本質就是一種模組.

2.包的作用?

##包的本質就是一個資料夾,那麼資料夾唯一的功能就是將文件組織起來,隨著功能越寫越多,我們無法將

所有功能都放在一個資料夾中,於是我們使用模組去組織功能,隨著模組越來越多,我們就需要用資料夾將

模組檔案組織起來,以此來提高程式的結構性和可維護性.

接下來建立一些套件用來後面的學習.套件很好創建,只需要一個資料夾,有__init__.py就可以了.

import os
os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
l = []
l.append(open('glance/__init__.py','w'))
l.append(open('glance/api/__init__.py','w'))
l.append(open('glance/api/policy.py','w'))
l.append(open('glance/api/versions.py','w'))
l.append(open('glance/cmd/__init__.py','w'))
l.append(open('glance/cmd/manage.py','w'))
l.append(open('glance/db/__init__.py','w'))
l.append(open('glance/db/models.py','w'))
map(lambda f:f.close() ,l)

建立好目錄結構

我們在每個資料夾中加入一些方法:

#policy.py
def get():
    print('from policy.py')
    
#versions.py
def create_resource(conf):
    print('from version.py: ',conf)
    
#manage.py
def main():
    print('from manage.py')
    
#models.py
def register_models(engine):
    print('from models.py: ',engine)

我們在test.py中就可以使用套件中的內容, 並且,我們導入套件的時候可以使用import或from xxx import xxx的形式

import glance.db.models
glance.db.models.register_models('mysql')
from glance.api.policy import get
get()

但是,注意:from xxx import xxx這種形式, import後⾯不可以出現"點" 也就是說from a.b import c是ok的.

但是from a import b.c 是錯誤的

3.__init__.py是做什麼的?

不論我們使用哪種方式導入一個包, 只要是第一次導入套件或是套件的任何其他部分, 都會先執行__init__.py檔.

這個檔案可以是空的, 但是也可以存放一些初始化的程式碼.

那麼我們之前用的from xxx import * 能用在包的呼叫上嗎?

可以,我們要在__init__.py檔中給出__all__來確定*導入的內容.

print("我是glance的__init__.py⽂件. ")
x = 10
def hehe():
    print("我是呵呵")
    
def haha():
    print("我是哈哈")
__all__ = ['x', "hehe"]

test.py

from glance import *
print(x) # OK
hehe() # OK
haha() # 报错. __all__⾥没有这个⻤东⻄

4.相對導入和絕對導入

我們的最定級包glance是寫給別人用的,然後在glance包內部也會有彼此之間互相導入的需求,這時候就有絕對導入和相對導入兩種導入方式.

1).絕對導入:一glance作為起始

2). 相對導入: 用. 或. . 作為起始

例如, 我們在glance/api/version.py中使⽤glance/cmd/manage.py

# 在glance/api/version.py
#绝对导⼊
from glance.cmd import manage
manage.main()
#相对导⼊
# 这种情形不可以在versions中启动程序.
# attempted relative import beyond top-level package
from ..cmd import manage
manage.main()

我們在測試的時候要注意,python包路徑跟運行腳本所在的目錄有關係.

在python中不允許你運行的程式導報的時候超過當前包的範圍​​(相對導入).

如果使用絕對導入.沒有這個問題.即,如果你在包內使用了相對導入.那在使用該包內信息的時候.只能在包外面導入

# 在policy.py
import versions

#如果我們程序的入口時policy,那此時程序是沒有任何問題的.但是如果我們在glance外面import了glance中的policy就會報錯.

原因是如果在外面訪問policy的時候.sys.path中的路徑就是外面.所以根本就不能直接找到versions模組.所以一定會報錯:

ModuleNotFoundError: No module named 'versions'

當我們導包出錯的時候,一定要先看sys.path.看一下是否真的能取得到包的資訊.

5.單獨導入一個包

# 在test.py中
import glance

此時導入的glance什麼做不了.因為在glance中的__init__.py中並沒有關於子包的載入.此時我們需要在__init__.py中分別去引入子包中的內容.

1.使用相對路徑

2.使用絕對路徑

套件的注意事項:

關於套件相關的導入語句也分別為import和from xxx import xxx兩種, 但無論使用哪一個,無論在什麼位置,在導入時都必須遵循一個原則: 凡是在導入時帶點的,

點的左邊都必須是一個包. 否則報錯. 可以帶一連串的點. 例如: from a.b.c import d

以上是python中包是什麼?有什麼作用? python中包的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除