包是一種通過使用『.模組名』來組織python模組命名空間的方式。
1. 無論是import形式還是from...import形式,凡是在匯入語句中(而不是在使用時)遇到帶點的,都要第一時間提高警覺:這是關於包才有的匯入語法
2. 包是目錄級的(資料夾級),資料夾是用來組成py檔案(包的本質就是乙個包含__init__.py檔案的目錄)
3. import匯入檔案時,產生命名空間中的名字**於檔案,import 包,產生的命名空間的名字同樣**於檔案,即包下的__init__.py,匯入包本質就是在匯入該檔案
強調:
1. 在python3中,即使包下沒有__init__.py檔案,import 包仍然不會報錯,而在python2中,包下一定要有該檔案,否則import 包報錯
2. 建立包的目的不是為了執行,而是被匯入使用,記住,包只是模組的一種形式而已,包即模組
先建立多個巢狀的包
import os
os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
l =
map(lambda f:f.close() ,l) # 使用map內建函式 關閉所有的檔案控制代碼
#檔案內容
#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)
注意事項:
1.關於包相關的匯入語句也分為import和from ... import ...兩種,但是無論哪種,無論在什麼位置,在匯入時都必須遵循乙個原則:凡是在匯入時帶點的,點的左邊都必須是乙個包,否則非法。可以帶有一連串的點,如item.subitem.subsubitem,但都必須遵循這個原則。
2.對於匯入後,在使用時就沒有這種限制了,點的左邊可以是包,模組,函式,類(它們都可以用點的方式呼叫自己的屬性)。
3.對比import item 和from item import name的應用場景: 如果我們想直接使用name那必須使用後者。
import
我們在與包glance同級別的檔案中測試
import glance.api.policy as policy
policy.get()
from ... import ...
需要注意的是from後import匯入的模組,必須是明確的乙個不能帶點,否則會有語法錯誤,如:from a import b.c是錯誤語法
我們在與包glance同級別的檔案中測試
from glance.api import policy
policy.get()
__init__.py檔案的作用
不管是哪種方式,只要是第一次匯入包或者是包的任何其他部分,都會依次執行包下的__init__.py檔案(我們可以在每個包的檔案內都列印一行內容來驗證一下),這個檔案可以為空,但是也可以存放一些初始化包的**。
在python2.7裡包必須帶有__init__.py檔案,python3裡並非這樣
import glance
#匯入包第一步會先執行包下面的__init__.py檔案
# 在包下的__init__.py檔案內新增內容 print('++++++++++') 直接執行
實用案例:
# 匯入了包,你要使用包更內層包裡的模組
import glance
# glance.api.policy.get() # 報錯
#匯入包第一步會先執行包下面的__init__.py檔案
# 在包下的__init__.py檔案內新增內容 print('++++++++++') 直接執行
# 修正方法
# 修改每個包裡的__init__.py 檔案
# 先修改glance包下的__init__.py檔案 --- 先將匯入包裡面的所有包
# from glance import api
# from glance import cmd
# from glance import db
# 接著修改每個包裡的__init__.py檔案 --- 因為是巢狀呼叫,使用的環境位置都不一樣,所以先從當前目錄直接引入當前的所有模組
# 新的需求,如果將glance 整體放入到乙個dir資料夾呢,還能正常呼叫嗎?
from dir import glance
# glance.db.models.register_models('test') # 報錯
# 解決方式1:將sys.path列表裡新增乙個檔案目錄可解決
# 解決方式2:新建乙個__inter__.py檔案,在檔案裡新增 from dir import glance 或者 from . import glance
# 接著修改glance下的__init__.py檔案 # 之所以用.是因為使用的是相對路徑的位址,無論怎麼移動都能引用到裡面的模組
# 絕對路徑
# 不管在包內部還是外部,匯入就能用
# 不能移動,但直觀
# 相對路徑
# 可以隨意移動包,只要能找到包的位置,就可以使用包裡的模組
# 包裡的模組如果想使用其他模組的內容,只能使用相對路徑,使用了相對路徑就不能在包內直接執行
Python學習之路 模組
python作為當今一種十分流行地語言,在許多方面都有著涉及,而支撐python能夠這麼強大的就是許許多多的開源庫。每乙個庫也是乙個模組,我們在設計程式時也要盡量將程式模組化。程式模組化後在後面的程式開發中就可以通過組合模組來搭建完整程式,避免重複造輪子的現象。模組化的優點 在python中利用im...
Python 學習之路 時間模組
1 import time23 得到時間戳,從1970年1.1凌晨到現在計時,1970出現unix 4print time.time 56 返回時間的字串模式,預設是當前系統時間 7print time.ctime 8print time.ctime time.time 86400 86400一天的...
Python菜鳥高階之路14 模組 包
1.什麼是模組和包。1 模組 就是乙個python檔案。2 包 存放著若干個模組且有乙個自帶的 init py檔案 的資料夾。init py檔案 當呼叫某個包的時候,會自動執行一次此檔案裡面的內容。因此通常我們可以用來進行一些初始化資料或者載入一些需要使用到的包。通過包我們也可以避免一些重複命名的模...