<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
package 在 python 中,是一種有效組織程式碼,module 可以是一個檔案,可以通過 import 來匯入一個 module 單個檔案,而 package 則是作為一個目錄來匯入。隨後我們還會看一看多層巢狀是如何匯入的。
>>> import collections,socket >>> print(collections.__path__) ['/anaconda3/envs/py38/lib/python3.8/collections'] >>> print(socket.__path__) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: module 'socket' has no attribute '__path__'
我們看一看 python 提供標註庫,例如 collections 和 socket,這裡 collections 是一個 package 也就是意味著其是一個目錄,在 python 檔案,而 socket 則是一個 module,對於 socket 和我們之前介紹匯入 module 一樣。package 與 module 不同就是具有 __path__
屬性,我們可以通過 __path__
來存取到存放 python 檔案的路徑。但是對於 module 並不存在這個屬性。
在 python 中,有兩種 package,分別是是 regular package 和 namespace package。
regular package:
我們首先來看一看 regular package,下面是一個 regular package 結構
main.py pkg1 ---__init__.py
在專案下,我們建立一個資料夾 kpg1 下面有一個檔案 __init__.py
,這樣 package 就是 regular package,這樣這個資料夾的名稱就是一個 package 名稱,我們匯入 package 就可以直接匯入這個 package 名稱。在 __init__.py
檔案裡新增如下語句.
print("importing pk1") def hi_say(): print("pkg1 say hi")
在 main.py 我們匯入 package 也就是 import pkg1
,python 通過 finder 來定位到 package 位置,pathFinder 通過在 sys.path 中的 path 搜尋來定位到 package 的位置。大家還記得嗎? sys.path 第一個 path 就是我們當前目錄,這是為什麼 python 可以定位到 pkg1 ,就是根據,當我們匯入 package python 就會自動執行 package 下面的 __init__.py
檔案。當你 import package 時,module 的編譯好 code 物件,我們可以通過 pkg1.hi_say()
來。
print(pkg1.__path__)
通過 pkg1 的 __path__
來方法 pkg1 的目錄絕對路徑。
print(pkg1.__file__)
而 __file__
對應得到 __init__.py
檔案的絕對路徑。
print(pkg1.__package__)
也可以通過 package 的 __package__
的屬性獲取 package 的名稱,同樣可以通過 __name__
來獲取 module 的名稱。
接下來我們進一步加大難度,就是 pkg1 資料夾下再新建一個 mod1.py 檔案
main.py pkg1 ---__init__.py ---mod1.py
__init__.py
檔案
print("importing pk1")
mod1.py 檔案中,輸出一條"import mod1"的資訊,還定義了 say_hi 函數,接下來我們想要做的事匯入這個 module 然後執行其中 say_hi 方法。
print("importing mod1") def say_hi(): print("pkg1 say hi")
import sys import pkg1 print('pkg1' in globals())#True print('pkg1' in sys.modules)#True
我們匯入 pkg1 這樣建立一個指向 module 物件的參照,然後新增全域性變數中,同時作為 module 也會被新增到 sys.modules 快取中。
然後當我們直接通過 pkg1.mod1 來存取 mod1 module 會丟擲下面錯誤,告訴使用者並不存在這個屬性
AttributeError: module 'pkg1' has no attribute 'mod1'
也就是隻是簡單匯入 package 並不會將其下的 module 一同匯入,所以才會出現上面錯誤。如果想要匯入 pkg1 下 mod1 我們需要使用 import pkg1.mod1
這樣正確方式來匯入 mod1
import sys import pkg1.mod1
大家注意一下當我們匯入 mod1 正確方式是用 import pkg1.mod1,從下面輸出來看,python 先執行 __init__.py
,也就是說 python 會先匯入 package pkg1 然後再匯入 module1 這樣順序。
importing pk1 importing mod1
如果下面方式可以存取到 module mod1 中的 say_hi() 方法。
pkg1.mod1.say_hi()
print('pkg1' in sys.modules)#True print('pkg1.mod1' in sys.modules)#True print('pkg1' in globals())#True print('pkg1.mod1' in globals())#False
通過上面輸出我們發現 pkg1 和 pkg1.mod1 都存在於 sys.modules 快取中,還有不難看出只有 pkg1 位於全域性變數,我們只能通過 pkg1 的屬性來方法 mod1。
簡單總結一下,我們要方法一個 package 下的 module,首先會存取這個 package 會執行 package 下的 __init__.py
然後再去執行 module 程式碼,在 sys.modules 儲存 pkg1 和 pkg1.mod1 分別指向儲存兩個 module 物件的記憶體地址。
到此這篇關於 如何在python 中匯入 package 的文章就介紹到這了,更多相關在 python 中匯入 package 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45