Python模塊使用部分1——模塊的導入與使用,包的使用

一、什麼是模塊

    模塊就是一組功能的集合體,模塊組織形式有以下幾種

        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 *時,*號表示的就是moneyread1這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的名稱空間。

 

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