Python 關(guān)于模塊和加載模塊的實現(xiàn)
一.導(dǎo)入模塊
模塊(Modules)
模塊就是Python程序,任何Python程序都可以作為模塊
代碼的可重用性,只要編程過程中需要用到該模塊中的某個功能(由變量、函數(shù)、類實現(xiàn)),直接在程序中導(dǎo)入該模塊即可使用該功能
封裝特性的結(jié)構(gòu):
諸多容器,列表、元組、字符串、字典等都是對數(shù)據(jù)的封裝
函數(shù)是對 Python 代碼的封裝
類是對方法和屬性的封裝,是對函數(shù)和數(shù)據(jù)的封裝
模塊,可以理解是對代碼更高級的封裝,把能夠?qū)崿F(xiàn)某一特定功能的代碼編寫在同一個.py 文件中,并將其作為一個獨立的模塊,還能有效避免函數(shù)名和變量名發(fā)生沖突
當(dāng)程序重復(fù)導(dǎo)入同一個模塊時,Python 只會導(dǎo)入一次
import
import 模塊名1 [as 別名1], 模塊名2 [as 別名2],…
會導(dǎo)入指定模塊中的所有成員(包括變量、函數(shù)、類等),需要使用模塊中的成員時,需用該模塊名(別名)作為前綴,否則解釋器會報錯
[] 部分,可以使用,也可以省略
sys模塊下的argv變量用于獲取運行程序的命令行參數(shù),argv[0]用于獲取當(dāng)前 程序的存儲路徑
import sys #導(dǎo)入sys整個模塊 print(sys.argv[0]) # 用sys模塊內(nèi)的成員時,必須添加模塊名作為前綴 C:/Users/Administrator/Desktop/2021-1-14/模塊.py
導(dǎo)入整個模塊時,可以為模塊指定別名
import sys as s # 導(dǎo)入sys整個模塊,指定別名為s print(s.argv[0]) # 使用sys模塊別名s作為前綴來訪問模塊中的成員 C:/Users/Administrator/Desktop/2021-1-14/模塊.py
可以一次導(dǎo)入多個模塊,多個模塊之間用逗號隔開
import sys,os # 導(dǎo)入sys、os兩個模塊 print(sys.argv[0]) # 使用模塊名作為前綴來訪問模塊中的成員 print(os.sep) # os模塊的sep變量代表平臺上的路徑分隔符 C:/Users/Administrator/Desktop/2021-1-14/模塊.py \
導(dǎo)入多個模塊時,也可以為模塊指定別名
import sys as s,os as o # 導(dǎo)入模塊,并分別為模塊指定別名 print(s.argv[0]) # 使用模塊別名作為前綴來訪問模塊中的成員 print(o.sep) C:/Users/Administrator/Desktop/2021-1-14/模塊.py \
from…import
from 模塊名 import 成員名1 [as 別名1],成員名2 [as 別名2],…
只會導(dǎo)入模塊中指定的成員,而不是全部成員,當(dāng)程序中使用該成員時,無需加任何前綴,直接使用成員名(或別名)
[] 部分,可以使用,也可以省略
用from...import來導(dǎo)入指定成員
from sys import argv # 導(dǎo)入sys模塊的argv成員 print(argv[0]) # 直接使用成員名訪問 C:/Users/Administrator/Desktop/2021-1-14/模塊.py
導(dǎo)入sys模塊中的 argv 成員,可在程序中直接使用 argv 成員,無須使用任何前綴
導(dǎo)入模塊成員時,為成員指定別名
from sys import argv as v # 導(dǎo)入sys模塊的argv成員,為其指定別名v print(v[0]) # 直接使用成員的別名訪問 C:/Users/Administrator/Desktop/2021-1-14/模塊.py
form...import 導(dǎo)入模塊成員時,可一次導(dǎo)入多個成員
from sys import argv, winver # 導(dǎo)入sys模塊的argv,winver成員 print(argv[0]) # 直接使用成員名訪問 print(winver) C:/Users/Administrator/Desktop/2021-1-14/模塊.py 3.4
sys模塊的winver成員記錄了該 Python 的版本號
一次導(dǎo)入多個模塊成員時,可使用 as 關(guān)鍵字為成員指定別名
from sys import argv as v, winver as wv # 導(dǎo)入sys模塊的成員,并為其指定別名 print(v[0]) # 直接使用成員的別名訪問 print(wv) C:/Users/Administrator/Desktop/2021-1-14/模塊.py 3.4
不推薦使用 from 模塊 import * 導(dǎo)入模塊所有成員
導(dǎo)入指定模塊內(nèi)的所有成員存在潛在的風(fēng)險,可能會出現(xiàn)同名成員
可通過別名來區(qū)分兩個模塊中的同名成員
__import __()
模塊是代碼文件,要求其文件名要符合操作系統(tǒng)的命名規(guī)則,如果模塊名中出現(xiàn)空格或數(shù)字開頭,無法使用 import 引入
如果模塊中包含空格或以數(shù)字開頭,需要使用__import__() 內(nèi)置函數(shù)引入模塊
__import__("demo text") __import__("1demo")
使用import()函數(shù)要以字符串的方式將模塊名引入,否則會報SyntaxError錯誤
二.自定義模塊
定義簡單的模塊(編寫在 demo.py 文件中)
name = "youchanwill" add = "you.com" print(name,add) def say(): print("自定義模塊") class test: def __init__(self,name,add): self.name = name self.add = add def say(self): print(self.name,self.add)
為了檢驗?zāi)0逯写a的正確性,需要為其設(shè)計一段測試代碼
say() test1 = test("you","you.net") test1.say()
在同一文件夾下新建一個test.py文件,使用 import 語句導(dǎo)入 demo.py
import demo #用import 語句導(dǎo)入時,只需要使用該模板文件的名稱 youchanwill you.com 自定義模塊 #測試代碼也被執(zhí)行 you you.net
其它程序以引入的方式執(zhí)行模板文件,測試代碼不應(yīng)該被執(zhí)行,可用__name__ 變量做修改
當(dāng)直接運行一個模塊時,__name__變量的值為__main__,而模塊被導(dǎo)入其他程序中并運行該程序時,處于模塊中的__name__變量的值就變成了模塊名
可在調(diào)用測試函數(shù)時增加判斷,當(dāng) __name__ =='__main__' 時才調(diào)用測試函數(shù)
修改 demo.py 模板文件中的測試代碼:
if __name__ == '__main__': say() test1 = test("you","you.net") test1.say()
修改后運行 test.py 文件時
import demo youchanwill you.com
執(zhí)行的是模板文件中的輸出語句,測試代碼并未執(zhí)行
說明文檔
自定義模塊添加說明文檔,和函數(shù)或類的添加方法相同,在模塊開頭的位置定義一個字符串
可以通過模板的 __doc__ 屬性,來訪問模板的說明文檔
import demo print(demo.__doc__) youchanwill you.com
這是說明文檔
三.加載模塊
環(huán)境變量
根據(jù)PYTHONPATH環(huán)境變量的值來確定到哪里去加載模塊
PYTHONPATH環(huán)境變量的值是多個路徑的集合,會依次搜索PYTHONPATH 環(huán)境變量所指定的多個路徑,從中找到程序想要加載的模塊
在 Windows 平臺上設(shè)置環(huán)境變量
右擊桌面上的“計算機”圖標(biāo),單擊“屬性”菜單項,系統(tǒng)顯示“控制面板\所有控制面板項\系統(tǒng)”窗口,單擊該窗口左邊欄中的“高級系統(tǒng)設(shè)置”鏈接,出現(xiàn)“系統(tǒng)屬性”對話框
單擊“高級” Tab 頁中的“環(huán)境變量”,對于當(dāng)前用戶而言,設(shè)置用戶變量和系統(tǒng)變量的效果大致相同,系統(tǒng)變量的路徑排在用戶變量的路徑之前
在“變量名”內(nèi)輸入 PYTHONPATH,表明將要建立 的環(huán)境變量;在“變量值”內(nèi)輸入 .;d:\python_ module,就是該環(huán)境變量的值,該值包含兩條路徑
第一條路徑為一個點(.),代表當(dāng)前路徑,表明當(dāng)運行 Python 程序時,總能從當(dāng)前路徑加載模塊
第二條路徑為 d:\python_ module,表明當(dāng)運行 Python 程序時,總能從 d:\python_ module 加載模塊
成功設(shè)置了環(huán)境變量后,只要把定義的模塊放在與當(dāng)前運行程序相同的路徑(或d:\python_ module 路徑),該模塊就能被成功加載
在 Linux 上設(shè)置環(huán)境變量
啟動 Linux 的命令行界面,在 home 路徑下輸入:
ls - a
Linux 平臺的環(huán)境變量通過 .bash_profile 文件設(shè)置,在該文件中添加 PYTHONPATH 環(huán)境變量
PYTHONPATH=.:/home/you/python_module #you是系統(tǒng)的登錄名
Linux 多個路徑之間以冒號(:)作為分隔符
完成變量值的設(shè)置后,在 .bash_profile 文件的最后添加導(dǎo)出 PYTHONPATH 變量的語句
export PYTHONPATH
運行該文件,使在文件中設(shè)置的 PYTHONPATH 變量值生效
可選擇重新登錄Linux 平臺,或輸入source .bash_profile
成功設(shè)置了環(huán)境變量后,只要把定義的模塊放在與當(dāng)前運行程序相同的路徑(或/home/yeeku/python_module 路徑),該模塊就能被成功加載
默認(rèn)的模塊加載路徑
安裝通用性模塊,這種模塊應(yīng)該直接安裝在 Python 內(nèi)部,可借助Python默認(rèn)的模塊加載路徑
通常情況下,應(yīng)將Python的擴展模塊添加在 lib\site-packages 路徑下,專門用于存放擴展模塊和包
將之前的demo.py文件復(fù)制在 lib\site-packages 路徑下
''' 這是說明文檔 ''' name = "youchanwill" add = "you.com" print(name,add) def say(): print("自定義模塊") class test: def __init__(self,name,add): self.name = name self.add = add def say(self): print(self.name,self.add) if __name__ == '__main__': say() test1 = test("you","you.net") test1.say()
可直接在Python交互式解釋器中測試該模塊
>>> import demo youchanwill you.com >>> print(demo.__doc__)
這是說明文檔
>>>
第一行代碼用于導(dǎo)入demo模塊;第二行代碼用于查看demo模塊的文檔,輸出該模塊開始定義的文檔內(nèi)容
導(dǎo)入模塊的本質(zhì)
import demo 導(dǎo)入模塊的本質(zhì)是將 demo.py 中的全部代碼加載到內(nèi)存并執(zhí)行
將整個模塊內(nèi)容賦值給與模塊同名的變量,該變量的類型是 module,在該模塊中定義的所有程序單元都相當(dāng)于該 module 對象的成員
from demo import name 導(dǎo)入模塊中成員的本質(zhì)是將 demo.py 中的全部代碼加載到內(nèi)存并執(zhí)行
只導(dǎo)入指定變量、函數(shù)等成員單元,不會將整個模塊導(dǎo)入
在導(dǎo)入模塊后,在模塊文件所在目錄下看到一個名為“__pycache__”的文件夾
Python 為每個模塊都生成一個 *.cpython-36.pyc 文件,該文件是為模塊編譯生成的字節(jié)碼,用于提升該模塊的運行效率
四.__all__變量
向文件導(dǎo)入某個模塊時,導(dǎo)入的是該模塊中那些名稱不以下劃線(單下劃線、雙下劃線)開頭的變量、函數(shù)和類
如果不想模塊文件中的某個成員被引入到其它文件中使用,可以在其名稱前添加下劃線
新建demo.py文件
def test1(): print("you") def test2(): print("chan") def test3(): print("will")
在新建的test.py文件中導(dǎo)入
from demo import * test1() test2() test3() you chan will
如果 demo.py 模塊中的 test1() 函數(shù)不想讓其它文件引入,只需將其名稱改為 _test1() 或者 __test1()
def _test1(): print("you") NameError: name 'test1' is not defined
__all__ 變量,該變量的值是一個列表,存儲的是當(dāng)前模塊中一些成員(變量、函數(shù)或者類)的名稱
通過在模塊文件中設(shè)置 __all__ 變量,當(dāng)其它文件以“from 模塊名 import *”的形式導(dǎo)入該模塊時,該文件中只能使用 __all__ 列表中指定的成員
只有以“from 模塊名 import *”形式導(dǎo)入的模塊,當(dāng)該模塊設(shè)有 __all__ 變量時,只能導(dǎo)入該變量指定的成員,未指定的成員無法導(dǎo)入
def test1(): print("you") def test2(): print("chan") def test3(): print("will") __all__ = ["test1","test2"] from demo import * test1() test2() test3() you chan NameError: name 'test3' is not defined
__all__ 變量僅限于在其它文件中以“from 模塊名 import *”的方式引入
import 模塊名 的形式導(dǎo)入模塊,可以通過模塊名前綴(別名)來調(diào)用模塊內(nèi)的所有成員(除了以下劃線開頭命名的成員),__all__變量的設(shè)置無效
from 模塊名 import 成員 導(dǎo)入指定成員,__all__變量的設(shè)置無用
到此這篇關(guān)于Python 關(guān)于模塊和加載模塊的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python 模塊和加載模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一行python實現(xiàn)樹形結(jié)構(gòu)的方法
今天小編就為大家分享一篇一行python實現(xiàn)樹形結(jié)構(gòu)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python實現(xiàn)求解最大公約數(shù)的五種方法總結(jié)
求最大公約數(shù)是習(xí)題中比較常見的類型,本文小編將給大家提供五種比較常見的算法,都是用Python語言實現(xiàn)的,感興趣的小伙伴可以了解一下2022-07-07python fabric實現(xiàn)遠(yuǎn)程操作和部署示例
這篇文章主要介紹了python使用fabric實現(xiàn)遠(yuǎn)程操作和部署示例,需要的朋友可以參考下2014-03-03解決pycharm debug時界面下方不出現(xiàn)step等按鈕及變量值的問題
這篇文章主要介紹了解決pycharm debug時界面下方不出現(xiàn)step等按鈕及變量值的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06tensorflow 輸出權(quán)重到csv或txt的實例
今天小編就為大家分享一篇tensorflow 輸出權(quán)重到csv或txt的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06