筆記帶有個(gè)人側(cè)重點(diǎn),不追求面面俱到。
16 模塊(具體不懂)
出處: 菜鳥(niǎo)教程 - Python3 模塊
模塊 是一個(gè)包含所有你定義的函數(shù)和變量的文件,其后綴名是.py。模塊可以被別的程序引入,以使用該模塊中的函數(shù)等功能。
16.1 import 語(yǔ)句
不管執(zhí)行了多少次 import,一個(gè)模塊只會(huì)被導(dǎo)入一次。
使用 import 語(yǔ)句的時(shí)候,Python 解釋器會(huì)從搜索路徑中依次尋找所引入的模塊。搜索路徑可以通過(guò) sys 模塊中的 path 變量進(jìn)行查看。
>>> import sys
>>> sys.path
['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
>>>
sys.path 輸出是一個(gè)列表,其中第一項(xiàng)是空串 ‘’,代表當(dāng)前目錄(若是從一個(gè)腳本中打印出來(lái)的話(huà),可以更清楚地看出是哪個(gè)目錄),亦即我們執(zhí)行python解釋器的目錄(對(duì)于腳本的話(huà)就是運(yùn)行的腳本所在的目錄)。
不要使用
from package import *
。
推薦使用import package
和from package import item
。
16.2 深入模塊
模塊除了方法定義,還可以包括可執(zhí)行的代碼。這些代碼一般用來(lái)初始化這個(gè)模塊。這些代碼只有在第一次被導(dǎo)入時(shí)才會(huì)被執(zhí)行。
每個(gè)模塊有各自獨(dú)立的符號(hào)表,在模塊內(nèi)部為所有的函數(shù)當(dāng)作全局符號(hào)表來(lái)使用。所以,模塊的作者可以放心大膽的在模塊內(nèi)部使用這些全局變量,而不用擔(dān)心把其他用戶(hù)的全局變量搞混。從另一個(gè)方面,當(dāng)你確實(shí)知道你在做什么的話(huà),你也可以通過(guò) modname.itemname
這樣的表示法來(lái)訪問(wèn)模塊內(nèi)的函數(shù)。
16.3 __name__屬性
一個(gè)模塊被另一個(gè)程序第一次引入時(shí),其主程序?qū)⑦\(yùn)行。 如果我們想在模塊被引入時(shí),模塊中的某一程序塊不執(zhí)行,可以用 __name__
屬性來(lái)使該程序塊僅在該模塊自身運(yùn)行時(shí)執(zhí)行。每個(gè)模塊都有一個(gè) __name__
屬性,當(dāng)其值是 __main__
時(shí),表明該模塊自身在運(yùn)行,否則是被引入。
#!/usr/bin/python3
# Filename: using_name.py
if __name__ == '__main__':
print('程序自身在運(yùn)行')
else:
print('我來(lái)自另一模塊')
輸出:
>>> python using_name.py
程序自身在運(yùn)行
>>> import using_name
我來(lái)自另一模塊
16.4 dir() 函數(shù)
內(nèi)置的函數(shù) dir()
可以找到模塊內(nèi)定義的所有名稱(chēng)。以一個(gè)字符串列表的形式返回。
>>> a = 1
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'a']
>>> import sys
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'sys']
>>> dir(sys)
['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__',
'__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__',
'_base_executable', '_clear_type_cache', '_current_exceptions', '_current_frames', '_deactivate_opcache',
'_debugmallocstats', '_enablelegacywindowsfsencoding', '_framework', '_getframe', '_git', '_home', '_xoptions',
'addaudithook', 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix', 'breakpointhook',
'builtin_module_names', 'byteorder', 'call_tracing', 'copyright', 'displayhook', 'dllhandle',
'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info',
'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth', 'get_int_max_str_digits',
'getallocatedblocks', 'getdefaultencoding', 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile',
'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion',
'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'maxsize', 'maxunicode',
'meta_path', 'modules', 'orig_argv', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'platlibdir',
'prefix', 'ps1', 'ps2', 'pycache_prefix', 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth',
'set_int_max_str_digits', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin',
'stdlib_module_names', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info', 'warnoptions', 'winver']
16.5 包
包 是一種管理 Python 模塊命名空間的形式,采用 “點(diǎn)模塊名稱(chēng)”。比如一個(gè)模塊的名稱(chēng)是 A.B, 那么他表示一個(gè)包 A中的子模塊 B 。
這里給出了一種可能的包結(jié)構(gòu)(在分層的文件系統(tǒng)中):
sound/ 頂層包
__init__.py 初始化 sound 包
formats/ 文件格式轉(zhuǎn)換子包
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ 聲音效果子包
__init__.py
echo.py
surround.py
reverse.py
...
filters/ filters 子包
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
在導(dǎo)入一個(gè)包的時(shí)候,Python 會(huì)根據(jù) sys.path 中的目錄來(lái)尋找這個(gè)包中包含的子目錄。
目錄只有包含一個(gè)叫做 __init__.py
的文件才會(huì)被認(rèn)作是一個(gè)包,主要是為了避免一些濫俗的名字(比如叫做 string)不小心的影響搜索路徑中的有效模塊。
# 導(dǎo)入方式
import sound.effects.echo
# 調(diào)用方式
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
# 導(dǎo)入方式
import sound.effects import echo
# 調(diào)用方式
echo.echofilter(input, output, delay=0.7, atten=4)
# 導(dǎo)入方式
from sound.effects.echo import echofilter
# 調(diào)用方式
echofilter(input, output, delay=0.7, atten=4)
當(dāng)使用 from package import item
這種形式的時(shí)候,import 語(yǔ)法會(huì)首先把 item 當(dāng)作一個(gè)包定義的名稱(chēng),如果沒(méi)找到,再試圖按照一個(gè)模塊去導(dǎo)入。如果還沒(méi)找到,拋出一個(gè) :exc:ImportError
異常。
反之,如果使用形如 import item.subitem.subsubitem
這種導(dǎo)入形式,除了最后一項(xiàng),都必須是包,而最后一項(xiàng)則可以是模塊或者是包,但是不可以是類(lèi),函數(shù)或者變量的名字。
16.6 從一個(gè)包中導(dǎo)入*
如果包定義文件 __init__.py
存在一個(gè)叫做 __all__
的列表變量,那么在使用 from package import *
的時(shí)候就把這個(gè)列表中的所有名字作為包內(nèi)容導(dǎo)入。
__all__ = ["echo", "surround", "reverse"]
如果 __all__
真的沒(méi)有定義,那么使用 from sound.effects import *
這種語(yǔ)法的時(shí)候,就不會(huì)導(dǎo)入包 sound.effects 里的任何子模塊。他只是把包 sound.effects 和它里面定義的所有內(nèi)容導(dǎo)入進(jìn)來(lái)(可能運(yùn)行 __init__.py
里定義的初始化代碼)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-699711.html
擴(kuò)展閱讀: CSDN Python 入門(mén)技能樹(shù)-預(yù)備知識(shí)-模塊管理文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-699711.html
到了這里,關(guān)于菜鳥(niǎo)教程《Python 3 教程》筆記(16):模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!