朋友們,如需轉(zhuǎn)載請(qǐng)標(biāo)明出處:https://blog.csdn.net/jiangjunshow
聲明:在人工智能技術(shù)教學(xué)期間鲸伴,不少學(xué)生向我提一些python相關(guān)的問(wèn)題,所以為了讓同學(xué)們掌握更多擴(kuò)展知識(shí)更好地理解AI技術(shù)设易,我讓助理負(fù)責(zé)分享這套python系列教程巢墅,希望能幫到大家迁酸!由于這套python教程不是由我所寫(有時(shí)候有空也會(huì)參與編寫)讲冠,所以不如我的AI技術(shù)教學(xué)風(fēng)趣幽默瓜客,學(xué)起來(lái)比較枯燥;但它的知識(shí)點(diǎn)還是講到位的了竿开,也值得閱讀谱仪!想要學(xué)習(xí)AI技術(shù)的同學(xué)可以點(diǎn)擊跳轉(zhuǎn)到我的教學(xué)網(wǎng)站。PS:看不懂本篇文章的同學(xué)請(qǐng)先看前面的文章德迹,循序漸進(jìn)每天學(xué)一點(diǎn)就不會(huì)覺得難了芽卿!
為什么要使用包導(dǎo)入技術(shù)揭芍?
有同學(xué)不理解包導(dǎo)入存在的意義胳搞,覺得它是多此一舉~~
其實(shí),萬(wàn)事萬(wàn)物都有其存在的意義,有一句哲理名言叫做——存在即合理肌毅。
現(xiàn)在你覺得包導(dǎo)入是多此一舉筷转,是因?yàn)槟氵€沒(méi)有相應(yīng)的經(jīng)驗(yàn)。就像我年輕時(shí)覺得避孕套是多此一舉一樣悬而,只能說(shuō)當(dāng)時(shí)too young too simple(太年輕太簡(jiǎn)單了)呜舒。當(dāng)我有了相應(yīng)的生活經(jīng)驗(yàn)后,反而覺得這個(gè)世界很多東西都可以沒(méi)有笨奠,但是不能沒(méi)有套套袭蝗。如果沒(méi)有套套,當(dāng)你某天加完班想出去放飛一下自我后般婆,可能就染上了驳叫取;如果沒(méi)有套套蔚袍,你可能就會(huì)因?yàn)橐粋€(gè)不小心而想起那個(gè)經(jīng)典的廣告“不是我不小心乡范,只是真情難以抗拒,某某某醫(yī)院啤咽,無(wú)痛人流晋辆,留住你的產(chǎn)權(quán)”。
好了宇整,回到正題瓶佳,總之,包導(dǎo)入就像套套一樣没陡,在某些時(shí)候必須得用涩哟!下面我會(huì)使用實(shí)例來(lái)幫助大家深入滴理解它。
我先給大家一個(gè)問(wèn)題盼玄,看你在不使用包導(dǎo)入技術(shù)的前提下該如何解決它贴彼。
假設(shè)你們公司要開發(fā)一個(gè)大的系統(tǒng),它里面包含了3個(gè)子系統(tǒng)埃儿。第一個(gè)子系統(tǒng)中包含了一個(gè)文件utilities.py器仗,它包含了一些通用的工具代碼。這個(gè)子系統(tǒng)的代碼文件放在一個(gè)名為system1的文件夾里童番。
system1\
utilities.py # Common utility functions,classes
main.py # Launch this to start the program
other.py # Import utilities to load my tools
第二個(gè)子系統(tǒng)里面也有名為utilities.py的文件精钮,它們?cè)诿麨閟ystem2的文件夾里。
system2\
utilities.py # Common utilities
main.py # Launch this to run
other.py # Imports utilities
上面只是鋪墊剃斧,下面問(wèn)題來(lái)了轨香!
如何才能在第三個(gè)子系統(tǒng)中既調(diào)用第一個(gè)子系統(tǒng)的utilities.py代碼又調(diào)用第二個(gè)子系統(tǒng)的utilities.py代碼?
你的第一反應(yīng)想到的應(yīng)該是去設(shè)置模塊搜索路徑幼东,引入包含utilities.py文件的目錄臂容。但是科雳,要在路徑內(nèi)先放哪個(gè)目錄呢:system1還是system2?
搜索路徑本質(zhì)上是線性的脓杉。搜索總是從左至右掃描糟秘,所以不管這個(gè)問(wèn)題你想多久,也只能得到搜索路徑上最左側(cè)(最先列出)的目錄內(nèi)的utilities.py球散。也就是說(shuō)尿赚,永遠(yuǎn)無(wú)法導(dǎo)入另一個(gè)目錄的utilities.py文件。
上面的問(wèn)題正是包所能夠解決的蕉堰。不應(yīng)該像上面那樣在目錄內(nèi)把文件安裝成單純的文件列表凌净,而是應(yīng)該將它們進(jìn)行打包,也就是多加個(gè)init.py文件(看不懂的同學(xué)可以回歸一下我前面的文章《Python系列教程231——init.py》)屋讶。例如泻蚊,上面那個(gè)包含3個(gè)子系統(tǒng)的大系統(tǒng)的文件結(jié)構(gòu)就可以組織成下面的樣子。
root\
system1\
__init__.py
utilities.py
main.py
other.py
system2\
__init__.py
utilities.py
main.py
other.py
system3\ # Here or elsewhere
__init__.py # Your new code here
myfile.py
代碼文件被組織成包后丑婿,我們就可以在第三個(gè)子系統(tǒng)中通過(guò)下面的包導(dǎo)入技術(shù)來(lái)同時(shí)調(diào)用第一和第二個(gè)子系統(tǒng)中的utilities.py代碼性雄。如下所示。
import system1.utilities
import system2.utilities
system1.utilities.function('spam')
system2.utilities.function('eggs')
注意8睢秒旋!上面使用了import來(lái)導(dǎo)入,所以每次調(diào)用工具模塊utilities的代碼時(shí)诀拭,都會(huì)重復(fù)其完整的目錄路徑迁筛。這樣一來(lái),一級(jí)一級(jí)目錄的名稱讓模塊的調(diào)用變得具有唯一性耕挨。
記紫肝浴!筒占!如果需要讀取兩個(gè)或兩個(gè)以上路徑內(nèi)的同名屬性時(shí)贪庙,才需要使用import,在這種情況下不能用from(看不懂的同學(xué)回顧一下《Python系列教程233——包導(dǎo)入時(shí)使用import還是from》)翰苫。如果被調(diào)用的函數(shù)名稱在每個(gè)路徑內(nèi)都不同止邮,from語(yǔ)句就可以避免每次都重復(fù)完整路徑的麻煩!
這篇文章的信息量有點(diǎn)大奏窑,有些同學(xué)可能要回顧一下我前面的文章才能看懂导披。簡(jiǎn)而言之就一句話,存在即合理埃唯,包導(dǎo)入技術(shù)就像套套一樣撩匕,必須要有!它可以避免導(dǎo)入時(shí)的模糊性墨叛。