參考《Python應(yīng)該如何導(dǎo)入(import)模塊及包》梳理
1. 整體概念基本介紹
雖然簡簡單單的導(dǎo)入import,其實涉及到很多的知識
我們導(dǎo)入往往是一個包,或者包內(nèi)的一個模塊,或者一個模塊內(nèi)的某些函數(shù)變量等
所以我們先對,包,模塊,函數(shù)、變量做一個簡單介紹
他們的包含關(guān)系是
包package(往往是一個目錄/文件夾)》模塊module(往往是一個文件)》變量,函數(shù),類
直觀來說,一個包往往包含多個模塊文件或者一些子包,每個模塊文件包含多個變量和函數(shù)方法,類等
下面分別是更詳細(xì)的介紹
1.1 包package
通常包是一個目錄
為了將目錄視為包,必須在其內(nèi)部包含一個名為 __init__.py
的文件。__init__.py
文件可以為空,也可以包含包的初始化代碼。
1.2 模塊 module
通常模塊為一個文件,直接使用import來導(dǎo)入就好了??梢宰鳛閙odule的文件類
一個模塊內(nèi)往往包括多個變量,函數(shù)
當(dāng)然實際上可以導(dǎo)入的四種包括
- 使用Python寫的程序( .py文件)
- C或C++擴展(已編譯為共享庫或DLL文件)
- 包(包含多個模塊)
- 內(nèi)建模塊(使用C編寫并已鏈接到Python解釋器內(nèi))
2 基本語法
這里涉及到名字空間的概念,具體可以看我前一篇博客Python進階(一)名字空間 | 超詳細(xì)名字空間解析 內(nèi)置 全局 局部 調(diào)試查看-CSDN博客
名字空間簡單理解就是一個變量和值的映射關(guān)系
2.1 import直接使用
import直接導(dǎo)入模塊,會創(chuàng)建一個新的導(dǎo)入模塊名字空間,當(dāng)前文件會引用這個導(dǎo)入模塊的名字空間
import module_name
2.2 from 及其用法
我們可以使用 from
關(guān)鍵字指定需要引入的具體內(nèi)容:
使用from
語句可以將模塊中的對象直接導(dǎo)入到當(dāng)前的名字空間. from
語句不創(chuàng)建一個到模塊名字空間的引用,而是把被導(dǎo)入模塊的一個或多個對象直接放入當(dāng)前的名字空間:
from module_name import function_name, class_name
from
語句支持逗號分割的對象,也可以使用星號*
代表模塊中除下劃線開頭的所有對象(注意這里導(dǎo)入是不會導(dǎo)入單下劃線開頭的變量)
from socket import * # 載入所有對象到當(dāng)前名字空間
如果一個模塊如果定義有列表__all__
,則from module import * 語句只能導(dǎo)入__all__
列表中存在的對象。
# module: foo.py
__all__ = [ 'bar', 'spam' ] # 定義使用 `*` 可以導(dǎo)入的對象
3.1 as的用法
也可以使用 as
關(guān)鍵字給模塊或內(nèi)容起別名:
import module_name as alias
另外, as
也可以和 from
聯(lián)合使用:
from socket import gethostname as hostname
h = hostname()
3 工作原理
3.1 搜尋
現(xiàn)在有一個問題,就是導(dǎo)入的時候解釋器會去哪里搜尋模塊?
當(dāng)我們使用 import
語句時,Python 解釋器會在一系列目錄中搜索模塊(sys.path列表)這些目錄包括當(dāng)前目錄(包含運行腳本的目錄)、內(nèi)置模塊目錄、環(huán)境變量 PYTHONPATH
中指定的目錄等。
一個典型的sys.path 列表的值:
Linux:
[’’, ‘/usr/local/lib/python2.0’,
‘/usr/local/lib/python2.0/plat-sunos5’,
‘/usr/local/lib/python2.0/lib-tk’,
‘/usr/local/lib/python2.0/lib-dynload’,
‘/usr/local/lib/python2.0/site-packages’]
Windows:
[’’, ‘C:\WINDOWS\system32\python24.zip’, ‘C:\Documents and Settings\weizhong’, ‘C:\Python24\DLLs’, ‘C:\Python24\lib’, ‘C:\Python24\lib\plat-win’, ‘C:\Python24\lib\lib-tk’, ‘C:\Python24\Lib\site-packages\pythonwin’, ‘C:\Python24’, ‘C:\Python24\lib\site-packages’, ‘C:\Python24\lib\site-packages\win32’, ‘C:\Python24\lib\site-packages\win32\lib’, ‘C:\Python24\lib\site-packages\wx-2.6-msw-unicode’]
空字符串 代表當(dāng)前目錄. 要加入新的搜索路徑,只需要將這個路徑加入到這個列表.
3.2 執(zhí)行
假設(shè)某源代碼文件初次引入某一個模塊
執(zhí)行的具體步驟如下
- 1.為源代碼文件中定義的對象創(chuàng)建一個模塊名字空間,通過這個名字空間可以訪問到模塊中定義的函數(shù)及變量。
- 2.在新創(chuàng)建的名字空間里完整執(zhí)行模塊文件和源代碼文件。
- 3.創(chuàng)建一個名為源代碼文件的對象,該對象引用模塊的名字空間,這樣就可以通過這個對象訪問模塊中的函數(shù)及變量,如:
import spam # 導(dǎo)入并運行模塊 spam
print (spam.a) # 訪問模塊 spam 的屬性
spam.foo()
c = spam.bar()
import
語句可以在程序的任何位置使用,你可以在程序中多次導(dǎo)入同一個模塊,但模塊中的代碼 僅僅 在該模塊被首次導(dǎo)入時執(zhí)行。后面的import語句只是簡單的創(chuàng)建一個到模塊名字空間的引用而已。
這里我們注意到上面的第2點,一旦模塊被導(dǎo)入,他的代碼就會被執(zhí)行一遍,但有些時候我不想讓模塊完整被執(zhí)行,那么該怎么辦呢?
3.3 避免導(dǎo)入模塊代碼執(zhí)行
當(dāng)一個模塊被導(dǎo)入時,它的代碼會被執(zhí)行一次。如果你希望某些代碼僅在模塊被直接運行時而不是被導(dǎo)入時執(zhí)行,可以使用 if __name__ == "__main__":
來進行條件判斷。
if __name__ == "__main__":
# 這里的代碼僅在模塊被直接運行時執(zhí)行
如下所示是一個詳細(xì)的例子
假設(shè)我們有一個名為 example_module.py
的模塊文件,內(nèi)容如下:
# example_module.py
def add_numbers(a, b):
return a + b
# 如果模塊被直接運行,則執(zhí)行以下代碼(比如直接運行python example_module.py)
if __name__ == "__main__":
x = 5
y = 10
result = add_numbers(x, y)
print(f"The sum of {x} and {y} is: {result}")
在這個例子中,example_module.py
定義了一個簡單的函數(shù) add_numbers
用于相加兩個數(shù)字。然后,在模塊的末尾,使用 if __name__ == "__main__":
來判斷模塊是被導(dǎo)入還是被直接運行。如果模塊被直接運行(比如直接運行python example_module.py),就會執(zhí)行一些特定的代碼,例如計算兩個數(shù)字的和并打印結(jié)果。
現(xiàn)在,如果我們在另一個腳本another_script.py中導(dǎo)入這個模塊,if __name__ == "__main__":
之后的代碼就不會被執(zhí)行。例如:
# another_script.py
import example_module
result = example_module.add_numbers(8, 12)
print(f"The sum of 8 and 12 is: {result}")
會輸出文章來源:http://www.zghlxwxcb.cn/news/detail-806124.html
The sum of 8 and 12 is: 20
在這個例子中,雖然我們導(dǎo)入了 example_module
,但由于我們沒有直接運行 example_module.py
,因此 if __name__ == "__main__":
之后的代碼不會執(zhí)行。只有當(dāng) example_module.py
被直接運行時,才會執(zhí)行這部分代碼。文章來源地址http://www.zghlxwxcb.cn/news/detail-806124.html
到了這里,關(guān)于python進階(二)導(dǎo)入import 機制 | 導(dǎo)入import 用法 工作原理全解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!