這篇文章帶給大家的內容是關於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中文網其他相關文章!