Python-45章 包

自定義包

從小到大

一個表達式 -> 一條語句 -> 語句塊 -> 函數 ->類 -> 模塊 -> 包 -> 一個項目
模塊是一個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)


#import glance.api.policy # 此時調用會非常麻煩,只寫目錄名會報api不存在錯誤
import glance
glance.api.policy.shui()
# 在glance 中的init文件寫入 from glance import api ,然後再api目錄下的init文件寫入 from glance.api import policy ,此時調用成功
# 如果在api下的init直接寫入import policy,如果api/init是啓動文件不會報錯並可以正常運行,但是外面(當前文件)會報錯找不到模塊名policy
import sys
print(sys.path)  # 查看模塊搜索路徑
# 啓動文件所在位置,決定了sys.path的路徑,以當前運行目錄爲根目錄

絕對導入和相對導入

----------# 啓動文件----------
import glance
glance.api.policy.shui()
# 此時運行成功.在policy中也可以運行
----------#policy文件:----------
# 絕對導入 從根開始 sys.path
#一般是比較安全的,
#導入manager文件中的dong
from glance .cmd import manage
def shui():
    manage.dong()
    print("劉老六喜歡睡覺")
----------#manage文件:----------
def dong():
    print("動物會動")
----------# glance/init文件:----------
from glance import api
----------#api/init文件----------
from glance.api import policy

相對導入

----------# 啓動文件----------
import glance
glance.api.policy.shui()
# 此時運行成功
----------#policy文件:----------
# 相對導入
# ..表示上一次, . 表示本層
from ..cmd import manage
def shui():
    manage.dong()
    print("劉老六喜歡睡覺")
----------#manage文件:----------
def dong():
    print("動物會動")
----------# glance/init文件:----------
from glance import api
----------#api/init文件----------
from glance.api import policy
---------- 此時啓動文件依舊可以正常運行,但是policy文件運行失敗
ImportError: attempted relative import with no known parent package
翻譯:試圖用相對導入超過了當前文件所在包
# 相對導入一定要在外面啓動,項目框架這麼寫(但是這好像是架構師的事)

import導入

---------- policy文件----------
from . import versions
def shui():
    manage.dong()
    versions.ver()
    print("劉老六喜歡睡覺")
# 此時policy依舊不能運行,啓動文件可以

查找路徑sys.path是根據啓動文件位置來定
import導入文件時,產生名稱空間中的名字來源於文件,import包,產生的名稱空間中的名字同樣來源於文件,即包下的__init__.py,導入包本質就是在導入該文件
包A和包B下有同名模塊也不會衝突,如A.a和B.a來自兩個名稱空間



至此,Python基礎就結束了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章