任何Python源文件都能以模塊的形式使用,例如:
# spam.py
a = 37
def foo():
print("I'm foo and a is %s" % a)
def bar():
print("I'm bar and I'm calling foo")
class Spam(object):
def grok(self):
print("I'm Spam.grok")
要以模塊的形式加載這段代碼,可以使用import spam語(yǔ)句。首次使用import加載模塊時(shí),它將做3件事:
1) 創(chuàng)建新的命名空間,用作在相應(yīng)源文件中定義的所有對(duì)象的容器。
2) 在新創(chuàng)建的命名空間中執(zhí)行模塊中包含的代碼。
3) 在調(diào)用函數(shù)中創(chuàng)建名稱為引用模塊命名空間,這個(gè)名稱與模塊的名稱相匹配,例如:
import spam
x = spam.a
spam.foo()
s = spam.Spam()
s.grok()
import執(zhí)行已加載源的文件中的所有語(yǔ)句。要導(dǎo)入多個(gè)模塊,可以為import提供逗號(hào)分隔的模塊名稱列表,例如:
import socket, os, re
用于引用模塊的名稱可以使用as限定符進(jìn)行更改,例如:
import spam as sp
import socket as net
sp.foo()
sp.bar()
net.gethostname()
import語(yǔ)句可以出現(xiàn)在程序中的任何位置,但是每個(gè)模塊中的代碼僅加載和執(zhí)行一次。
?
from語(yǔ)句用于將模塊中的具體定義加載到當(dāng)前命名空間中。from語(yǔ)句相當(dāng)于import,但它不會(huì)創(chuàng)建一個(gè)名稱來(lái)引用新創(chuàng)建的模塊命名空間,而是將對(duì)模塊中定義的一個(gè)或多個(gè)對(duì)象的引用放到當(dāng)前命名空間中。例如:
from spam import foo
foo()
spam.foo() # NameError
from語(yǔ)句還會(huì)接受用逗號(hào)分隔的對(duì)象名稱列表,例如:
from spam import(foo, bar, Spam)
另外,as限定符可用于重命名使用from導(dǎo)入的具體對(duì)象,例如:
from spam import Spam as Sp
s = Sp()
"*"星號(hào)通配符也可用于加載模塊中的所有定義,但以下劃線開(kāi)頭的定義除外,例如:
from spam import *
form module import 語(yǔ)句只能在模塊最頂層使用。通過(guò)定義列表__all__,模塊可以精確控制from spam import \導(dǎo)入的名稱集合,例如:
# spam.py
__all__ = ['bar', 'spam']
使用from導(dǎo)入形式導(dǎo)入定義不會(huì)更改定義的作用域規(guī)則。函數(shù)的全局命名空間始終是定義該函數(shù)的模塊,而不是將函數(shù)導(dǎo)入并調(diào)用該函數(shù)的命名空間。
?
加載模塊時(shí),解釋器在sys.path路徑中搜索字典列表。sys.path中的第一個(gè)條目通常是空字符串,表示當(dāng)前正在使用的字典。sys.path中的其他條目可能包含字典名稱、.zip歸檔文件和.egg文件。各個(gè)條目在sys.path中列出的順序決順決定了加載模塊時(shí)的搜索順序。
可以將一組模塊打包為一個(gè)文件,設(shè)想創(chuàng)建兩個(gè)模塊foo.py和bar.py,并將它們放在一個(gè)名為mymodules.zip的zip文件中,就可以以如下方式添加到搜索路徑:
import sys
sys.path.append("mymodules.zip")
import foo, bar
zip文件可以與常規(guī)路徑名稱組件混合使用,例如:
sys.path.append("/tmp/modules.zip/lib/python")
從zip中導(dǎo)入需要注意一些限制。首先,只能從歸檔文件中導(dǎo)入.py、.pyw、.pyc和.pyo文件。而且,從歸檔文件加載.py文件時(shí),Python不會(huì)建.pyc和.pyo文件,這會(huì)導(dǎo)致加載模塊時(shí)的性能下降。
?
使用import加載的模塊實(shí)際上可分為4個(gè)通用類別:
1) 使用Python編寫的代碼
2) 已被編譯為共享庫(kù)或DLL的C或C++擴(kuò)展
3) 包含一組模塊的包
4) 使用C編寫并鏈接到Python解釋器的內(nèi)置模塊
查看編塊(以foo為例)時(shí),解釋器在sys.path下的每個(gè)目錄中搜索以下文件(按搜索順序列出):
1) 目錄foo,它定義了一個(gè)包
2) foo.pyd、foo.so、foomodule.so或foomodule.dll(已編譯的擴(kuò)展)
3) foo.pyo(只適用于使用了-O或-OO選項(xiàng)時(shí))
4) foo.pyc
5) foo.py(Windows上還會(huì)查找.pyw文件)
對(duì)于.py文件,首次導(dǎo)入模塊時(shí),它會(huì)被編譯為字節(jié)碼并作為.pyc文件寫回磁盤。在后續(xù)導(dǎo)入中,解釋器將加載這段預(yù)編譯的字節(jié)碼,除非.py文件的修改日期要更新一些。.pyc文件與解釋器的-O選項(xiàng)結(jié)合,文件已刪除了行號(hào)、斷言和其他調(diào)試信息的字節(jié)碼。如果指定-OO選項(xiàng),還會(huì)從文件中刪除文檔字符串。
只有使用import語(yǔ)句才能將文件自動(dòng)編譯為.pyc和.pyo文件。另外,如果包含模塊的.py文件的目錄不允許寫入,將不會(huì)創(chuàng)建這些文件。解釋器的-B選項(xiàng)也可以禁止生成這些文件。
如果存在.pyc和.pyo文件,則可以沒(méi)有相應(yīng)的.py文件。但即使沒(méi)有提供源文件,仍然可以檢查并找到大量細(xì)節(jié)。并且,為某個(gè)Python版本生成的.pyc文件可能不適用于其他的Python版本。
?
包可用于將一組模塊分組到一個(gè)常見(jiàn)的包名稱下,這有助于解決不同應(yīng)用程序中使用的模塊名稱之間的命名空間沖突問(wèn)題。包是通過(guò)使用與其相同的名稱創(chuàng)建目錄,并在該目錄中創(chuàng)建文件__init__.py來(lái)創(chuàng)建的??梢詫⑷缦滦问浇M織一個(gè)包:
Graphics/
__init__.py
Primitive/
__init__.py
lines.py
fill.py
text.py
Graph3d/
__init__.py
plot2d.py
Graph4d/
__init__.py
plot3d.py
png.py
tiff.py
jpeg.py
import語(yǔ)句用于通過(guò)多種方式從包中加載模塊:
1) import Graphics.Primitive.fill
2) from Graphics.Primitive import fill
3) from Graphics.Primitive.fill import floodfill
只要第一次導(dǎo)入包中的任何部分,就會(huì)執(zhí)行__init__.py中的代碼。這個(gè)文件可以為空。在import語(yǔ)句執(zhí)行期間,遇到的所有__init__.py文件都會(huì)執(zhí)行。因此,之前示例中的import Graphics.Primitive.fill語(yǔ)句將會(huì)首先執(zhí)行Graphics目錄中的__init__.py文件,然后執(zhí)行Primitive目錄中的__init__.py文件。
處理以下這條語(yǔ)句時(shí)需注意:
from Graphics.Primitive import *
使用該語(yǔ)句希望將與某個(gè)包相關(guān)聯(lián)的所有子模塊導(dǎo)入到當(dāng)前命名空間中,但是該語(yǔ)句只會(huì)導(dǎo)入在Primitive目錄的__init__.py文件中定義的所有名稱。這種行為可以通過(guò)定義列表__all__來(lái)修改,例如:
# Graphics/Primitive/__init__.py
__all__ = ["lines", "text", "fill"]
如果想要導(dǎo)入同一個(gè)包中的其他子模塊時(shí),可以使用相對(duì)導(dǎo)入,例如:
# fill.py
from . import lines
相對(duì)導(dǎo)入也可以加載同一個(gè)包的不同目錄中包含的子模塊,例如:
# plot2d.py
from ..Primitives import lines
相對(duì)導(dǎo)入只能命名用from module import symbol形式的導(dǎo)入語(yǔ)句來(lái)指定。因此import ..Primitives.lines或import .lines這樣的語(yǔ)句在語(yǔ)法上是不對(duì)的。
最后,Python導(dǎo)入一個(gè)包時(shí),它將定義特殊變量__path__,該變量包含一個(gè)目錄列表,查找包的子模塊時(shí)將搜索這個(gè)列表。__path__可通過(guò)__init__.py文件中包含的代碼訪問(wèn),最初包含的一項(xiàng)具有包的目錄包稱。如果有必要,包可以向__path__列表提供更多目錄,更改查找子模塊時(shí)使用的搜索路徑。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章名稱:[Python]模塊、包-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://jinyejixie.com/article6/djcsig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、服務(wù)器托管、搜索引擎優(yōu)化、移動(dòng)網(wǎng)站建設(shè)、電子商務(wù)、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容