官术网_书友最值得收藏!

1.3 導入代碼

假設你有一段Python代碼,需要在多個文件中使用。方法之一是,在每次需要該代碼時,都進行復制和粘貼。這不僅費時而無聊,而且如果你想對代碼做一些改動,則需要打開每一個粘貼有這段代碼的文件,然后以同樣的方式修改它??上攵@樣編寫軟件的效率不高。

幸運的是,Python提供了一個共享代碼的強大功能:模塊導入。當模塊b導入模塊a時,模塊b可以訪問模塊a中的代碼。這使我們可以在某處編寫程序,然后跨文件共享。讓我們以本書第二部分將要編寫的兩個模塊為例。

假設有兩個模塊:point.py和vector.py。這兩個模塊都在前面提到的包中:

第一個模塊point.py定義了幾何基元——點,第二個模塊vector.py定義了另一個幾何基元——向量。圖1-1是兩個模塊的圖示。每個模塊都分為兩個部分:灰色區域代表從其他地方導入的代碼,白色區域代表模塊自身定義的代碼。

現在,假設point.py模塊的某些功能需要使用向量(例如,使用向量移動某個點),我們可以使用Python的import命令訪問vector.py中的向量代碼。圖1-2描繪了這個過程,Python將向量代碼帶到point.py的“導入區”,使它在模塊內部可以被使用。

圖1-1 兩個Python模塊

圖1-2 從vector.py導入Vector類

在圖1-2中,我們使用了如下Python命令:

這個命令只從vector.py中獲取Vector類,不會導入其他任何東西。

下面將會介紹幾種模塊導入方法。

不同的導入形式

為了理解導入模塊和模塊內實體的不同方法,我們需要使用Mechanics項目的兩個包:

在本例中,我們會使用geom2d和eqs包的各兩個文件,或者模塊。每個模塊都定義了一個與模塊同名的類,類名的首字母大寫。例如,point.py模塊定義了Point類,vector.py模塊定義了Vector類,matrix.py模塊定義了Matrix類。圖1-3展示了包的結構。

圖1-3 Mechanics項目中的兩個包和它們的部分模塊

記住這個目錄結構,讓我們分析幾個場景。

(1)導入同一個包的模塊

在geom2d包的point.py模塊中,如果想導入整個vector.py模塊,我們可以使用以下方法:

這樣我們就可以使用vector.py中的內容,如下所示:

請注意,由于我們導入的是整個模塊,而不是它的某個實體,因此我們必須用模塊名稱來指向該模塊中定義的實體。如果想給被引用的模塊一個不同的名稱,我們可以給它重命名:

然后可以這樣使用它:

我們還可以從模塊中導入特定的名稱,而不是整個模塊。正如你前面所看到的,它的語法如下:

使用這種導入方式,我們可以執行如下操作:

在這種情況下,我們還可以重命名導入的名稱:

當我們為一個導入的名稱起別名時,我們只需將其重命名為其他名稱。在本例中,代碼可以寫成如下形式:

(2)導入不同包的模塊

如果想在matrix.py模塊中導入point.py模塊,那么由于point.py在不同的包中,我們可以如下操作:

或者

這讓我們可以在matrix.py中使用point.py模塊的全部內容:

同樣,我們可以對導入的模塊重命名:

或者,等價地:

用這兩種方式,我們都可以使用pt如下:

我們還可以從模塊中導入特定的名稱,而不是整個模塊,如下所示:

與前面一樣,我們可以使用一個別名:

(3)相對導入

最后是相對導入。相對導入(relative import)是指導入模塊所使用的路徑是相對路徑,其起點是文件的當前位置。

我們用一個點(.)指代同一個包內的模塊或包,用兩點(..)指代該包的父級目錄。

同樣是前面的例子,我們可以使用相對導入在matrix.py內導入point.py模塊:

上述代碼中,路徑..geom.point的含義是:從當前的目錄移動到父級目錄,然后定位point.py模塊。

主站蜘蛛池模板: 岗巴县| 东源县| 佳木斯市| 云南省| 九江市| 凌海市| 孟津县| 全州县| 景洪市| 龙州县| 昭平县| 周口市| 崇阳县| 丹巴县| 高阳县| 德令哈市| 轮台县| 陆良县| 化州市| 徐汇区| 乌拉特后旗| 璧山县| 丽水市| 吴旗县| 新野县| 东宁县| 嘉禾县| 佛冈县| 雅江县| 广宗县| 冷水江市| 武汉市| 弥勒县| 郑州市| 淅川县| 海盐县| 阿拉善左旗| 卓资县| 镇赉县| 万载县| 曲阜市|