day21 02 包的進階 1._init_.py文件的操作 導入包 根據day21 01 包的初識,建立的glance包,直接import glance後通過“包點包。。點方法”是不能執行所要的方法的,必須通過在一層一層裡面的_init_.py或者其他類似的文件做相對應的導入操作,才可以運行以下代 ...
day21 02 包的進階
1._init_.py文件的操作---導入包
根據day21 01 包的初識,建立的glance包,直接import glance後通過“包點包。。點方法”是不能執行所要的方法的,必須通過在一層一層裡面的_init_.py或者其他類似的文件做相對應的導入操作,才可以運行以下代碼而不會報錯:
import glance glance.api.policy.get()
2.絕對路徑導入
將建立的glance包放入新建的dir文件夾中,然後執行代碼:
from dir import glance glance.api.policy.get()
看著這代碼似乎合情合理,但是運行結果會報錯,為什麼呢?這和前面所說的路徑問題有關:
當你運行 from dir import glance的時候,通過sys.path可以知道,會把你當前運行所在的頁面的路徑保存到sys.path的第一個,比如你當前的界面的路徑是'C:\\Users\\sku1-1\\PycharmProjects\\untitled,但是在此目錄下並沒有找到glance這個包,以至於glance裡面的init文件也不會執行,後面就會報錯,而要想不會報錯就需要通過確切的路徑去執行:
from dir.glance.api import policy policy.get()
這樣確切的路徑就稱為絕對路徑,絕對路徑的
優點:比較直觀,不管是在內部還是外部,導入就能使用
缺點:就是包不能挪動,一挪動就會出錯
3.相對路徑導入(一般在自己可以完全製作一個完整的包的時候再使用)
一個點:代表當前目錄
兩個點:代表上一層目錄
在glance包下麵的_init_.py文件夾中輸入:
from . import api from . import cmd from . import db
就是從當前文件夾中導入api,cmd,db,同時在api,cmd包下的_init_.py文件輸入:
from . import policy from . import versions
from . import manage
然後在運行界面執行:
import glance glance.api.policy.get()
就可以使用policy方法了
如果將glance放入dir文件中,執行:
from dir import glance glance.cmd.manage.get()
同樣可以使用cmd裡面的方法,這種使用當前目錄導入包的方法
優點:可以隨意移動包,只要能找到包的位置,就可以使用包裡面的方法
缺點:不能在包里使用這個模塊了,比如包下麵文件與文件之間的函數的相互調用,只能使用相對路徑,使用了相對路徑就不能在內部直接執行了
比如:在policy模塊裡面使用cmd模塊的方法:
def get(): print('from policy.py') from dir import glance glance.cmd.manage.main()
此時運行結果將會報錯:只要使用了相對路徑導入包,包裡面所有使用相對路徑去使用的都是會報錯的,但是在包外面是可以隨意使用的
4.from 包 import * 和_all_相對導入
在glance包裡面的_init_.py文件添加內容:
from .api import * from .cmd import * from .db import *
在api,cmd,db裡面的_init_.py文件分別寫入:
_all_=['policy','versions'] _all_=['manage'] _all_=['models']
這樣就可以把api,cmd,db裡面所有的方法都執行了,後面要調用policy,直接
import glance policy.get()
就可以調用policy方法了,但是把api,cmd,db隔離開,相當於都沒有它們名字本身什麼事了,這種方法其實也是使用相對路徑,也就存在相對路徑的優缺點
對於初學者來說:要一定會使用絕對導入,而瞭解相對導入
5.使用python編程軟體開發的一些規範
(1)bin文件:程式入口,文件裡面有個start.py,一般裡面放的內容基本是固定
(2)core文件:軟體核心代碼
假如這兩個文件裡面含有:
bin文件裡面 init_.py start.py core文件裡面 _init_.py core.py文件裡面 def main:
print('main') login.py文件裡面:
def login:
print('login')
此時要想在core.py文件裡面調用login(),如何實現呢?
首先在bin文件裡面的start.py裡面寫入:
import os import sys sys.path.append(os.path.dirname(os.getcwd())) #os.getcwd()獲取次頁面所在的目錄,即bin的目錄 # os.path.dirname(os.getcwd())#獲取bin所在的目錄,即當前頁面所在的上層目錄,而bin所在的目錄還包含了core文件 #sys.path.append(os.path.dirname(os.getcwd()))將獲取到的上層目錄添加到os.path中 # 這樣當在此頁面開始執行的時候bin和core文件裡面的都可以找得到,所以可以直接導入bin和core裡面的方法調用函數 from core import core#從core裡面導入core模塊,並執行 if _name_=='_main_':#在此頁面執行的時候,就執行以下代碼 core.main()#調用core裡面的main函數
由於添加了上層目錄的問題,可以直接在core.py裡面導入login模塊,然後直接調用login模塊裡面的login函數:
from core import login#從core裡面導入login模塊 def main(): print('main') login.login()#已經導入login模塊了,可以直接調用函數了
運行start.py頁面,結果:
main
login
(3)conf文件:配置文件,放置一些任何人都可以看得懂的東西:一般給運維人員看的,一般他們不懂代碼,但是他們可以通過調參數,改變代碼
(4)db文件:資料庫,比如登入認證的的數據
(5)lib文件:自己寫的通用模塊或包,完整模塊,不需要安裝
(6)log文件:日誌,記錄一些執行結果,待後面去查詢
現在只是大概有一個思路,好多都還不會,後面會講到