一、什麼是模塊
模塊就是一組功能的集合體,模塊組織形式有以下幾種
1、一個python文件是一個模塊,文件名是module.py,模塊名則是module(自定義模塊的常見格式)
2、 已被編譯爲共享庫或DLL的C或C++擴展
3、使用C編寫並鏈接到python解釋器的內置模塊
4、把一系列模塊組織到一起的文件夾(注:文件夾下有一個__init__.py文件,該文件夾稱之爲包)
二、爲什麼要用模塊
1、可以將程序中頻繁用來的一些公共的功能組織到一個文件中,從而減少代冗餘
2、直接使用內置或者第三方的模塊中的功能,這種拿來主義可以提升開發效率
三、如何用模塊
導入模塊的方式:
import sudada #導入一個模塊sudada(在當前目錄下)
from sudada import xx #導入一個模塊sudada,只使用模塊內的xx這個變量
from sudada.X.X import xx as rename #導入多個模塊,並給這些模塊定義一個別名
from sudada.X.X import * #導入多個模塊,使用模塊內所有的變量(*代表所有)
模塊導入需要注意的點:
導入多個相同的模塊,只會執行一次
四、模塊的導入與使用
4.1 import 方式
首次導入模塊spam:spam爲一個測試的文件(內容如下: )
print('from the spam.py')
money=1000
read1=100
read2=200
1、會產生一個模塊spam的名稱空間。
2、會執行spam模塊文件裏的代碼,將產生的名字放到spam模塊的名稱空間中。
3、會在當前run.py名稱空間中拿到一個模塊名spam,該模塊名spam指向spam.py模塊的名稱空間。
import parm # 導入模塊parm
print(parm.money) # 引用parm模塊中的money時,不能直接寫變量名(直接寫money找到的是當前文件內的變量money),需要在變量名前加模塊名(parm.money)
>>: 1000
import parm as sm # 導入模塊指定一個別名爲sm,那麼引用這個別名sm即可
print(sm.money)
>>: 1000
import parm, sudada, ssp #引用多個模塊,中間用逗號隔開
優點:指名道姓的訪問模塊名稱空間的名字,不會與當前名稱空間的名字衝突
缺點:每次引用模塊時都需要加模塊名前綴
4.2 from ... import ... 方式
首次導入模塊:spam爲一個測試的文件(內容如下: )
print('from the spam.py')
money=1000
read1=100
read2=200
1、會產生一個模塊的名稱空間。
2、會執行模塊文件的代碼,將產生的名字放到模塊的名稱空間中。
3、會在當前名稱空間中直接拿到一個模塊名稱空間的名字。
強調:來自於模塊parm名稱空間內的函數,調用該函數時一定是以模塊parm內的名稱空間爲準的。
from parm import money #導入模塊parm中的money
print(money)
>>: 1000
from parm import money,read1,read2 #導入模塊parm中的money,read1,read2,用逗號分開
print(money)
print(read1)
print(read2)
>>: 1000
>>: 100
>>: 200
from parm import money as sm #導入模塊parm中的money並給money定義別名爲sm
print(sm)
>>: 1000
優點:使用方便簡介
缺點:容易與當前名稱空間的名字衝突
導入模塊內所有的名字 -- 不推薦使用,因爲導入模塊內所有的內容時,容易與當前名稱空間的名字衝突。除非在我們需要引入模塊中很多名字的時候,可以用*,起到一個節省代碼的作用。
from parm import * #導入模塊parm中的所有名稱空間的名字(*表示所有),不推薦使用
print(money)
print(read1)
print(read2)
5、自定義導入模塊內的某個名字 -- 那麼在使用該模塊時只能使用指定的名字
spam爲一個測試的文件(內容如下: )
print('from the spam.py')
money=1000
read1=100
read2=200
1.在模塊內(文件的開頭)寫一個內置變量"__all__=['money','read1']"
__all__=['money','read1']
2.使用from parm import *時,*號表示的就是money和read1這2個變量了
from parm import *
print(money)
print(read1)
五、Python腳本與Python模塊的區別
5.1、使用內置函數"__name__"來區分Python腳本與Python模塊
1、當sparm.py這個文件當做Python腳本使用時,使用print(__name__)得到的返回值爲"__main__"
# 在spqrm.py文件裏面填上代碼:只寫一行
print(__name__)
>> :__main__ #運行python文件時,返回值爲"__main__"表示當前文件爲python腳本文件
2、當sparm.py這個文件當做Python模塊導入使用時,使用print(__name__)得到的返回值爲爲"sparm(模塊名)"
# 在run.py文件裏面使用import sparm,然後右鍵執行
import sparm
>>:sparm #被當做模塊引用時,返回值爲"sparm(模塊名稱)"
5.2、區分python文件的用途 Python腳本或Python模塊
1、通常在一個被當做模塊使用的(python文件)末尾加上條件判斷,定義這個python文件的用途(當做模塊還是腳本文件)
if __name__ == '__main__':
money
read1()
read2()
# 當這個python文件被當做腳本使用時,會調用money,read1(),read2()三個參數
# 當這個python文件被當做模塊使用時,則不會調用任何參數
六、模塊的搜索路徑
6.1、查找模塊的先後順序 -- 內存--->內置--->sys.path (環境變量)
查看當前模塊所在的路徑:sys模塊 -- sys.path的值是以當前執行文件爲準(sys.path的值爲當前文件所在的目錄)
import sys
print(sys.path)
>>:['C:\\Users\\stsud\\Desktop\\Pycharm文檔', 'C:\\Users\\stsud\\Desktop\\Pycharm文檔', 'C:\\Install Path\\Python3.6\\python36.zip', 'C:\\Install Path\\Python3.6\\DLLs', 'C:\\Install Path\\Python3.6\\lib', 'C:\\Install Path\\Python3.6', 'C:\\Install Path\\Python3.6\\lib\\site-packages', 'C:\\Install Path\\Python3.6\\lib\\site-packages\\pip-10.0.1-py3.6.egg', 'C:\\Install Path\\Pycharm-破解版\\PyCharm 2018.1\\helpers\\pycharm_matplotlib_backend']
6.1.1、當一個python文件導入另外一個python文件,並且2個文件都不在同一目錄時,那麼需要把被導入的文件所在的目錄加入到全局路徑:
import sys
sys.path.append(r'C:\Users\stsud\Desktop\Pycharm文檔\ATM-1\core') #指定目標文件所在的路徑
6.2、查看當前文件所在的路徑(使用OS模塊)
import os
查看當前代碼所在的文件絕對路徑
print(os.path.abspath(__file__))
>>:C:\Users\stsud\Desktop\Pycharm文檔\ATM-1\bin\start.py
查看當前代碼所在文件的目錄
print(os.path.dirname(os.path.abspath(__file__))) 或者
print(os.path.dirname(__file__))
>>:C:\Users\stsud\Desktop\Pycharm文檔\ATM-1\bin
查看當前代碼所在文件的上一級目錄
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
>>:C:\Users\stsud\Desktop\Pycharm文檔\ATM-1
七、軟件開發的目錄規範 -- 新建一個項目,然後在項目的運行文件run.py內,把整個項目的根目錄加入到環境變量裏面。
7.1、在run.py文件內導入不同目錄下的python模塊 # run.py是程序的執行文件,由於run.py在處理環境變量時,把ATM這個目錄加入到環境變量裏面去了,所以整個代碼都是以run.py的環境變量爲準的!
將run.py文件所在的上一級目錄作爲整個項目的根目錄,然後將這個根目錄添加到環境變量裏面去:
import sys
import os
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #BASE_DIR就是整個項目的根目錄
sys.path.append(BASE_DIR) #把定義的根目錄追加到"sys.path"裏面
print(BASE_DIR) # C:\Users\stsud\Desktop\Pycharm文檔\ATM-1
from core import src #使用from導入core目錄下的src模塊
if __name__ == '__main__': #條件判斷python文件是腳本使用還是當做模塊使用
src.run() #運行src模塊下的函數run()
強調:在run.py文件內把"BASE_DIR"也就是整個項目的根目錄加到"sys.path.append(BASE_DIR) "裏面去之後,在run.py文件內就可以使用"from 目錄名 import 模塊名"導入根目錄下任何模塊,當前根目錄下的其他python文件在導入某一個模塊時,同樣可以使用 "from 目錄名 import 模塊名"的方式導入。
7.2、在python代碼裏面如何調用一個 "非python文件類型的文件(python文件可以直接使用from XX import *的方式引用)" ,比如 *.json文件,*.log文件。
1、先指定"DB_PATH"對應的目錄是哪一個:DB_PATH=os.path.join(BASE_PATH,'db')
2、然後在python代碼裏使用os.path.join的方式,拿到"DB_PATH"目錄內某個文件的全局路徑(拿到這個文件的全局路徑,就可以直接調用這個文件了)。
一、先定義根目錄
import os
1、BASE_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
2、定義"DB_PATH"對應的是根目錄下的哪個目錄
DB_PATH=os.path.join(BASE_PATH,'db') #os.path.join後面接"根目錄"以及"DB_PATH"所在的目錄
二、在其他python文件裏面如何調用"DB_PATH"裏面的文件
1、from conf import setting #先導入定義了"DB_PATH"所在的模塊
2、json_file=os.path.join(setting.BASE_DB, 'test.json') #調用"BASE_DB"下的"test.json"文件
八、模塊的一種使用形式--包
8.1、什麼是包?
包本質就是模塊:意味着包就是用來被導入使用的。
包就是有一個包含有__init__.py文件的文件夾。
包的用途:是來組織/存放多個子模塊。
8.2、包下面的__init__.py文件的作用是什麼?
導入一個包(文件夾),由於文件夾裏面沒有任何代碼,所以導入這個包什麼都拿不到。但是import的語法不會改變,import會導入一個文件,併產生名稱空間, 並執行文件裏面的代碼。
所以這個包(文件夾)裏面就需要一個文件(__init__.py),這個文件就是這個包(文件夾)的替代品。那麼在導入這個包(文件夾)時,就去找__init__.py這個文件(替代品),以__init__.py文件爲基礎生成名稱空間,並執行__init__.py文件裏面的代碼。
綜上所述:導入一個包,會生成名稱空間並執行代碼,由於文件夾不能做這個事,所以需要爲每個文件內配置一個__init__.py文件來做這個事。
8.3、首次導入包aaa:
1、以包下的__init__.py爲準產生一個名稱空間,那麼每次取值都會去__init__.py文件裏面找名稱空間。
2、執行__init__.py文件,將執行過程中產生的名字都放入名稱空間中。
3、在當前執行文件中會拿到一個名字aaa,aaa就是指向__init__.py的名稱空間。