Python的import 模塊小記

和函數及類的機制一樣,模塊其實就相當於文件夾,而類其實相當於文件、函數就相當表示某個章節的段落,而其中的文字就是變量,這些變量或者文件是可以在各個模塊中重複的(重名不衝突)。

模塊的好處還在於,能夠更有效的對功能類或函數進行獨立管理和獨立擴展,減小類或函數間的耦合,就相當於文件夾或壓縮包對文件進行管理一樣。

今天,主要小記一下python的幾種常見的模塊,以及如何引入模塊,各種引入方式之間的區別,最後說明一下模塊加載機制和常用的加載函數。

Python的import 模塊小記


我們一般用import關鍵字來告訴計算機中的python,該去自己內置sys中的變量path所記錄的路徑去檢索文件了,當遇到import後面的模塊名字標記的模塊,那就將這個模塊的地址給放入當前運行程序的命名空間裡。


>>> import sys
>>> sys.path
['', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\Lib\\idlelib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']
#其中第一個空字符串''代表當前目錄



def sum(a,b):
 sum = a*b
 print(sum)
sum(2,3)

並將文件存放在桌面


Python的import 模塊小記


然後,由於python中的path路徑的檢索機制,我們需要將另一個文件也要存放在桌面(當然,如果不放桌面也可以,只要你瞭解機器或程序的工作機制原理,你想怎麼處理都可以)


import sumdemo
sumdemo.sum(22,3)
#如果直接用sum(22,3),而非sumdemo.sum(22,3)會怎麼樣?
#會直接去找python內置的sum函數,從而出現報錯


Python的import 模塊小記


我們把引入模塊sumimport也放在桌面,以便利用python系統內置的path檢索路徑特點,讓sumimport找到sumdemo。

值得注意的是,python會自動給我們引入路徑裡面添加一個文件__pycache__,這個緩存文件。

我們將這個文件夾打開,看到裡面是一個python編譯文件,以cpython為文件後綴,並標記為python編譯文件,而前面是被引入的模塊名——sumdemo


Python的import 模塊小記



  • import的工作機制特點

一般import寫在引入文件的首行或第二行(如果有包的話,第一行一般用來放包引入的語句),但寫在文件程序的中間部分,也不會有什麼影響,只是為了程序更加容易理解和易讀,約定俗成而已。

另外,一個被引入模塊不論被寫了多少次import,都只會被導入一次(或許是因為命名空間是以字典方式存儲變量地址的緣故——變量名作為鍵,變量地址作為值,這或許也是一個圈層內的命名空間不許變量重名的緣故)

  • from.....import ....的機制

在實際中,我們應用最多的應該是這種形式,該形式優勢在於針對引入一個模塊中的某個部分的地址到當前程序運行的命名空間,而非將這個模塊的地址到命名空間裡。其劣勢在於,對於被引入模塊的某些私有變量或功能無法引入。

當然,我們可以採用 from module import * 這裡的*代表引入模塊中的所有功能,但對於模塊中用_這個單下劃線表示的變量或功能函數,是引入不進來的。

這種引入方式,因為失去了module這個地址作為文件夾來保護這些引入的變量和功能函數,那這些變量和功能就失去了“文件夾”的保護,容易和程序員自己編寫程序所起的變量產生命名衝突。

而這樣做的好處也是有的:我們可以不用module.name來進行變量和功能,而直接用name即可。因為,我們通過from ....import ......引入的方式,可以直接將name導入到當前程序運行的命名空間內,而不將module的名字導入到命名空間內。


Python的import 模塊小記


  • dir()函數——能夠將一個模塊中所有定義過的變量和功能變量都羅列出來,返回的是一個變量的列表。

>>> dir("sys")
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> dir("sumdemo")
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> dir("sumimport")
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

其中的__name__和__file__分別為導入的模塊名和導入的文件名


Python的import 模塊小記


Python的import 模塊小記


另外,globals()和local()兩個函數主要用來返回模塊中命名空間裡的全局變量和局部變量


Python的import 模塊小記


可能因為我定義的這個模塊,沒有太複雜的層級關係,導致局部量其實和全局變量是同一個層次。

  • reload()——可以讓程序重新加載一次模塊的引入,在php中也有相應的關鍵詞,就是php中的require(或require_once),還有php中的include或include_once。

但是要注意放入這個函數里的不是字符串,而直接是這個模塊的名稱。

  • 包——最大的一個文件夾,然後壓縮,或者說包是程序的命名空間,就如同我們將文件歸攏到不同的文件夾後,還要打包,然後再發送給其他人使用一樣。


在python中,包就是一個文件夾(你從python官網下載python的編程環境,安裝後,你看一下是不是一個個功能的文件夾。)


Python的import 模塊小記


這些包文件夾中還有文件夾,比如我們打開lib這個核心功能文件夾,發現裡面還有很多我們變成要用到的功能模塊,也被python按照文件歸類的方式放入了一個個有序的文件夾中。


Python的import 模塊小記


最後我們打開集合處理功能的文件夾collections,發現裡面有如下的文件和文件夾——其中__init__.py是包的開始標識。


Python的import 模塊小記


但這個文件夾裡面包含了一個__init__.py的文件,python就會自動給包含這個文件的層級“打包”成一個包,也就是說,這個__init__.py文件就相當於一個標識。不過我們也可以在__init__.py文件中進行包結構的“登記”,比如將每次包裡面添加的為實現另一個功能的模塊在__all__這個變量中進行登記,是個好習慣。因為,其實我們每次使用import進行包中的模塊導入時,其實在python的內部機制中,就是找到這個__init__.py中去找__all__這個變量而已,即通過all這個變量來告訴python,這個包裡面有那些文件。


Python的import 模塊小記


也就是說,如果我們使用from module import * ,其中對於python的處理機制是,遇到從包裡導入模塊,那麼只會找到包裡的__init__.py的__all__這個列表,然後只會將這個變量列表中的模塊導入。


Python的import 模塊小記



  • __name__的屬性

當程序運行模塊本身時,那麼提交給系統的命名空間中__name__為main,但如果這個模塊是被引入到另一個模塊中時,提交給系統的命名空間就不是那麼直接。那我們根據這個屬性,就可以設置當這個模塊被調用,哪些內容可以被執行,而哪些內容不能夠被執行。


Python的import 模塊小記

來源網絡,侵權聯繫刪除


分享到:


相關文章: