7.16模块及软件开发目录规范
模塊
1.什么是模塊?
就是一系列功能的結合體
2.模塊的三種來源
(1)內置的(python解釋器自帶)
(2)第三方的(別人寫的)
(3)自定義的(你自己寫的)
3.模塊的四種表現
(1)使用python編寫的py文件(也就意味著py文件也可以稱之為模塊:一個py文件也可以稱之為一個模塊)
(2)已被編譯為共享庫或DLL的C或C++擴展(了解)
(3)把一系列模塊組織到一起的文件夾(文件夾下有一個__init__.py文件,該文件夾稱之為包)
包:一系列py文件的結合體
(4)使用C編寫并連接到python解釋器的內置模塊
4.為什么要用模塊
(1)用別人寫好的模塊(內置的,第三方的):典型的拿來主義,能夠極大的提高開發效率
(2)使用自己寫的模塊(自定義的):當程序比較龐大的時候,你的項目不可能只在一個py中,那么當多個文件中都需要使用相同的方法的時候,可以將該公共的方法寫到一個py文件中,其他的文件以模塊的形式導過去直接調用該方法即可
5.使用模塊一定要注意的點
一定要區分哪個是執行文件,哪個是被導入的文件
import導入模塊
import md # md是需要導入的py文件(模塊)1.導入模塊后運行會發生什么
如果被導入的模塊文件名為md.py,執行導入操作的文件是run.py
右鍵運行run.py,文件首先會創建一個run.py的名稱空間
第一種,首次導入模塊的情況:
(1)運行md.py這個文件
(2)運行md.py文件中的代碼將產生的名字與值存放到md.py名稱空間中
(3)在執行文件(run.py)中,產生一個指向名稱空間的名字(md)
第二種,多次導入同一個模塊的情況:
多次導入不會再執行模塊文件,會沿用第一次導入的成果
2.如何訪問模塊中的名字指向的值
# 如果md模塊中有變量為 money = 1000 import md # 使用import導入模塊 print(md.money) # 訪問模塊名稱空間中的名字的統一句勢為:模塊名.名字使用import導入模塊,訪問模塊名稱空間中的名字的統一句勢為:模塊名.名字
(1)指名道姓的訪問模塊中的名字,永遠不會與執行文件中的名字沖突
(2)你如果想訪問模塊中名字,必須用模塊名.名字的方式
3.import還可以同時調用幾個模塊
import md,os,time # python支持一行導入多個模塊python支持一行導入多個模塊,但是不推薦使用,因為這樣結構不清晰,只有當幾個模塊有相同部分或者屬于同一個模塊,可以使用上面的方法
當幾個模塊沒有聯系的情況下,應該分多次導入:
import md import os import time補充:通常導入模塊的句式會寫在文件的開頭
4.當模塊名字比較復雜的情況下可以給該模塊名取別名
# 如果模塊名特別長比較復雜,可以給該模塊取別名 import mddddddddddddd as m print(m.money)from...import...導入模塊
?
# 如果md模塊中有變量money、函數read1、函數read2... from md import money,read1,read2 from md import money,read1,read2 # 多次導入不會執行,會沿用第一次導入的成果?
1.導入模塊后運行會發生什么
如果被導入的模塊文件名為md.py,執行導入操作的文件是run.py
右鍵運行run.py,文件首先會創建一個run.py的名稱空間
首次導入模塊的情況:
(1)運行md.py這個文件
(2)運行md.py文件中的代碼將產生的名字與值存放到md.py名稱空間中
(3)在執行文件(run.py)中,直接拿到指向模塊md.py名稱空間中某個值的名字
2.from...import...句式的特點
from md import money money = '我是執行文件中的money' # 執行文件中定義一個money print(money) # 結果是:我是執行文件中的money # 模塊中money的值會被覆蓋,相當于重新賦值了(1)訪問模塊中的名字不需要加模塊名前綴
(2)在訪問模塊中的名字可能會與當前執行文件中的名字沖突
3.補充
# 如何一次性將md模塊中的名字全部加載過來 from md1 import * print(money) print(read1) print(read2)為什么*可以將一次性將md模塊中的名字全部加載過來,其實是拿到__all__中的所有的名字,不寫默認所有的,寫了就是寫多少拿多少
__all__可以指定當所在py文件被當做模塊導入的時候,可以限制導入者能夠拿到的名字個數
循環導入問題及解決思路
m1模塊:
print('正在導入m1') from m2 import y # 首次導入m2 x = 'm1'm2模塊:
print('正在導入m2') from m1 import x # 第二次導m1 y = 'm2'執行文件:
from dir1.dir import m1 m1.f1()會報錯,因為x和y都還沒定義
1.如何解決?
(1)方式一:將循環導入的句式寫在文件最下方
修改過的m1模塊
print('正在導入m1') x = 'm1' from m2 import y # 首次導入m2修改過的m2模塊
print('正在導入m2') y = 'm2' from m1 import x # 第二次導m1再運行執行文件就不會報錯了
from dir1.dir import m1 m1.f1()(2)方式二:函數內導入模塊
修改過的m1模塊
print('正在導入m1') def f1():from dir1.dir.m2 import y,f2print('m1.f1>>>y:',y)f2() x = 'm1'修改過的m2模塊
print('正在導入m2') def f2():from dir1.dir.m1 import xprint('m2.f2>>>x:',x) y = 'm2'再運行執行文件就不會報錯了
from dir1.dir import m1 m1.f1()2.但是:
如果出現循環導入問題,那么一定是你的程序設計的不合理,循環導入不應該出現在程序里面,循環導入問題應該在程序設計階段就避免
__name__用法
1.如何使執行文件調用模塊的時候,不執行模塊的代碼
def index1():print('index1')def index2():print('index2') if __name__ == '__main__': # 當文件被當做執行文件執行的時候__name__打印的結果是__main__ index1() # 所以才執行下面的代碼 index2() # 所以才執行下面的代碼但是當文件被當做模塊導入的時候__name__打印的結果是模塊的名字,而不再是__main__,所以下面的代碼就不會運行了
2.快捷寫法
if __name__ == '__main__': # 快捷寫法,只輸入main然后直接tab鍵即可補全只輸入main然后直接tab鍵,PyCharm即可幫我們補全
模塊的查找順序
1.模塊的查找順序
(1)先從內存中找
(2)然后從內置中找
(3)再從sys.path中找(類似于環境變量)
import sys sys.path.append(r'D:\Python項目\day14\dir1') # 把模塊所在的文件夾路徑添加到環境變量sys是一個模塊,sys.path返回的是一個大列表,里面放了一堆文件路徑,第一個路徑永遠是執行sys.path的這個文件所在的文件夾的路徑。
所以使用sys.path的時候一定要分清楚誰是執行文件誰是被導入文件
2.注意:
py文件名千萬不要與模塊名(內置的、第三方)相同,沖突了就說明設計不合理
模塊的絕對導入和相對導入
1.絕對導入
form dir import m1 # 文件的絕對路徑絕對路徑就相當于F:\python\day14\代碼\day14\dir1\dir\m1.py,拿著這個路徑無論在哪都能找到要找的對象
絕對導入必須依據執行文件所在的文件夾路徑為準,絕對導入無論在執行文件中還是被導入文件都適用
2.相對導入
.?代表的當前路徑
.. 代表的上一級路徑
... 代表的是上上一級路徑
....?代表的是上上上一級路徑
注意:
相對導入不能在執行文件中使用,只能在被導入的模塊中使用,使用相對導入,就不需要考慮執行文件到底是誰,只需要考慮模塊與模塊之間的路徑關系是什么
軟件開發目錄規范
項目根目錄(項目名)
(1)bin文件夾
里面放項目啟動文件,例如:start.py(啟動文件還可以放在根目錄下)
# 啟動文件的代碼 import sys import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) # 獲取用戶軟件根目錄的絕對路徑 sys.path.append(BASE_DIR) # 添加到環境變量中 from core import src if __name__ == '__main__':src.run() # 導入項目的文件并運行 # __file__ 獲取當前文件所在文件夾的絕對路徑 # os.path.dirname(__file__)獲取當前文件所在文件夾往上一層文件夾的絕對路徑 View Code(2)conf文件夾
里面放項目配置文件,例如:settings.py
(3)core文件夾
里面放項目核心邏輯文件,例如:src.py
(4)db文件夾
里面放數據相關
(5)lib文件夾
里面放項目所用到的公共的功能,例如:common.py
(6)log文件夾
里面放項目的日志文件,例如:log.log
(7)readme文本文件(readme.txt)
對你這款軟件的介紹,介紹項目
轉載于:https://www.cnblogs.com/francis1/p/11197651.html
總結
以上是生活随笔為你收集整理的7.16模块及软件开发目录规范的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性表之链式存储结构_单链表相关算法
- 下一篇: LeetCode 20. Valid P