最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Python中的相對(duì)導(dǎo)入和絕對(duì)導(dǎo)入

 更新時(shí)間:2017年01月06日 11:44:08   作者:Huoty''''s Blog  
絕對(duì)導(dǎo)入是指跳過(guò)包內(nèi),直接搜索 sys.path ,在sys.path的基礎(chǔ)上進(jìn)行我們的模塊搜索。相對(duì)導(dǎo)入是指先包內(nèi),再包外,再,,,那么下面這篇文章主要給大家介紹了Python中的相對(duì)導(dǎo)入和絕對(duì)導(dǎo)入,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。

前言

Python 相對(duì)導(dǎo)入與絕對(duì)導(dǎo)入,這兩個(gè)概念是相對(duì)于包內(nèi)導(dǎo)入而言的。包內(nèi)導(dǎo)入即是包內(nèi)的模塊導(dǎo)入包內(nèi)部的模塊。

Python import 的搜索路徑

  1. 在當(dāng)前目錄下搜索該模塊
  2. 在環(huán)境變量 PYTHONPATH 中指定的路徑列表中依次搜索
  3. 在 Python 安裝路徑的 lib 庫(kù)中搜索

Python import 的步驟

python 所有加載的模塊信息都存放在 sys.modules 結(jié)構(gòu)中,當(dāng) import 一個(gè)模塊時(shí),會(huì)按如下步驟來(lái)進(jìn)行

  1. 如果是 import A,檢查 sys.modules 中是否已經(jīng)有 A,如果有則不加載,如果沒(méi)有則為 A 創(chuàng)建 module 對(duì)象,并加載 A
  2. 如果是 from A import B,先為 A 創(chuàng)建 module 對(duì)象,再解析A,從中尋找B并填充到 A 的 __dict__

相對(duì)導(dǎo)入與絕對(duì)導(dǎo)入

絕對(duì)導(dǎo)入的格式為 import A.Bfrom A import B,相對(duì)導(dǎo)入格式為 from . import Bfrom ..A import B,.代表當(dāng)前模塊,..代表上層模塊,...代表上上層模塊,依次類推。

相對(duì)導(dǎo)入可以避免硬編碼帶來(lái)的維護(hù)問(wèn)題,例如我們改了某一頂層包的名,那么其子包所有的導(dǎo)入就都不能用了。但是 存在相對(duì)導(dǎo)入語(yǔ)句的模塊,不能直接運(yùn)行,否則會(huì)有異常:

ValueError: Attempted relative import in non-package

這是什么原因呢?我們需要先來(lái)了解下導(dǎo)入模塊時(shí)的一些規(guī)則:

在沒(méi)有明確指定包結(jié)構(gòu)的情況下,Python 是根據(jù) __name__ 來(lái)決定一個(gè)模塊在包中的結(jié)構(gòu)的,如果是 __main__ 則它本身是頂層模塊,沒(méi)有包結(jié)構(gòu),如果是A.B.C 結(jié)構(gòu),那么頂層模塊是 A?;旧献裱@樣的原則:

  1. 如果是絕對(duì)導(dǎo)入,一個(gè)模塊只能導(dǎo)入自身的子模塊或和它的頂層模塊同級(jí)別的模塊及其子模塊
  2. 如果是相對(duì)導(dǎo)入,一個(gè)模塊必須有包結(jié)構(gòu)且只能導(dǎo)入它的頂層模塊內(nèi)部的模塊

如果一個(gè)模塊被直接運(yùn)行,則它自己為頂層模塊,不存在層次結(jié)構(gòu),所以找不到其他的相對(duì)路徑。

Python2.x 缺省為相對(duì)路徑導(dǎo)入,Python3.x 缺省為絕對(duì)路徑導(dǎo)入。絕對(duì)導(dǎo)入可以避免導(dǎo)入子包覆蓋掉標(biāo)準(zhǔn)庫(kù)模塊(由于名字相同,發(fā)生沖突)。如果在 Python2.x 中要默認(rèn)使用絕對(duì)導(dǎo)入,可以在文件開(kāi)頭加入如下語(yǔ)句:

from __future__ import absolute_import

from __future__ import absolute_import

這句 import 并不是指將所有的導(dǎo)入視為絕對(duì)導(dǎo)入,而是指禁用 implicit relative import(隱式相對(duì)導(dǎo)入), 但并不會(huì)禁掉 explicit relative import(顯示相對(duì)導(dǎo)入)。

那么到底什么是隱式相對(duì)導(dǎo)入,什么又是顯示的相對(duì)導(dǎo)入呢?我們來(lái)看一個(gè)例子,假設(shè)有如下包結(jié)構(gòu):

thing
├── books
│ ├── adventure.py
│ ├── history.py
│ ├── horror.py
│ ├── __init__.py
│ └── lovestory.py
├── furniture
│ ├── armchair.py
│ ├── bench.py
│ ├── __init__.py
│ ├── screen.py
│ └── stool.py
└── __init__.py

那么如果在 stool 中引用 bench,則有如下幾種方式:

import bench     # 此為 implicit relative import
from . import bench   # 此為 explicit relative import
from furniture import bench # 此為 absolute import

隱式相對(duì)就是沒(méi)有告訴解釋器相對(duì)于誰(shuí),但默認(rèn)相對(duì)與當(dāng)前模塊;而顯示相對(duì)則明確告訴解釋器相對(duì)于誰(shuí)來(lái)導(dǎo)入。以上導(dǎo)入方式的第三種,才是官方推薦的,第一種是官方強(qiáng)烈不推薦的,Python3 中已經(jīng)被廢棄,這種方式只能用于導(dǎo)入 path 中的模塊。

相對(duì)與絕對(duì)僅針對(duì)包內(nèi)導(dǎo)入而言

最后再次強(qiáng)調(diào),相對(duì)導(dǎo)入與絕對(duì)導(dǎo)入僅針對(duì)于包內(nèi)導(dǎo)入而言,要不然本文所討論的內(nèi)容就沒(méi)有意義。所謂的包,就是包含 __init__.py 文件的目錄,該文件在包導(dǎo)入時(shí)會(huì)被首先執(zhí)行,該文件可以為空,也可以在其中加入任意合法的 Python 代碼。

相對(duì)導(dǎo)入可以避免硬編碼,對(duì)于包的維護(hù)是友好的。絕對(duì)導(dǎo)入可以避免與標(biāo)準(zhǔn)庫(kù)命名的沖突,實(shí)際上也不推薦自定義模塊與標(biāo)準(zhǔn)庫(kù)命令相同。

前面提到含有相對(duì)導(dǎo)入的模塊不能被直接運(yùn)行,實(shí)際上含有絕對(duì)導(dǎo)入的模塊也不能被直接運(yùn)行,會(huì)出現(xiàn) ImportError:

ImportError: No module named XXX

這與絕對(duì)導(dǎo)入時(shí)是一樣的原因。要運(yùn)行包中包含絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入的模塊,可以用 python -m A.B.C 告訴解釋器模塊的層次結(jié)構(gòu)。

有人可能會(huì)問(wèn):假如有兩個(gè)模塊 a.py 和 b.py 放在同一個(gè)目錄下,為什么能在 b.py 中 import a 呢?

這是因?yàn)檫@兩個(gè)文件所在的目錄不是一個(gè)包,那么每一個(gè) python 文件都是一個(gè)獨(dú)立的、可以直接被其他模塊導(dǎo)入的模塊,就像你導(dǎo)入標(biāo)準(zhǔn)庫(kù)一樣,它們不存在相對(duì)導(dǎo)入和絕對(duì)導(dǎo)入的問(wèn)題。相對(duì)導(dǎo)入與絕對(duì)導(dǎo)入僅用于包內(nèi)部。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用python能有一定的幫助,如果有疑問(wèn)大家可以留言交流。

相關(guān)文章

最新評(píng)論

乐山市| 清水河县| 通河县| 涞水县| 康定县| 怀来县| 牡丹江市| 泾源县| 周口市| 嘉峪关市| 休宁县| 自贡市| 安乡县| 聂拉木县| 平原县| 黔南| 微博| 丽江市| 斗六市| 隆尧县| 保定市| 沧源| 邛崃市| 望奎县| 黄山市| 拉萨市| 阳新县| 宁海县| 冀州市| 客服| 巨野县| 通化县| 凯里市| 新化县| 建阳市| 锦州市| 离岛区| 岳池县| 南阳市| 晋州市| 铜山县|