天天看點

python有三種導入子產品的方法



python有三種導入子產品的方法

其一,

import modname : 子產品是指一個可以互動使用,或者從另一Python 程式通路的代碼段。隻要導入了一個子產品,就可以引用它的任何公共的函數、類或屬性。子產品可以通過這種方法來使用其它子產品的功能。

用import語句導入子產品,就在目前的名稱空間(namespace)建立了一個到該子產品的引用.這種引用必須使用全稱,也就是說,當使用在被導入子產品中定義的函數時,必須包含子產品的名字。是以不能隻使用 funcname,而應該使用 modname.funcname

其二,

from modname import funcname

from modname import fa, fb, fc

或者  from modname import *

與第1種方法的差別:funcname 被直接導入到本地名字空間去了,是以它可以直接使用,而不需要加上子產品名的限定

* 表示,該子產品的所有公共對象(public objects)都被導入到 目前的名稱空間,也就是任何隻要不是以”_”開始的東西都會被導入。

modname沒有被定義,是以modname.funcname這種方式不起作用。并且,如果funcname如果已經被定義,它會被新版本(該導入子產品中的版本)所替代。如果funcname被改成指向其他對象,modname不能不會覺察到。

建議:

1)如果你要經常通路子產品的屬性和方法,且不想一遍又一遍地敲入子產品名,使用 from module import

2)如果你想要有選擇地導入某些屬性和方法,而不想要其它的,使用 from module import

3)如果子產品包含的屬性和方法與你的某個子產品同名,你必須使用import module來避免名字沖突

4)盡量少用 from module import * ,因為判定一個特殊的函數或屬性是從哪來的有些困難,并且會造成調試和重構都更困難。

其三

内建函數__import__()

除了前面兩種使用import關鍵字的方法以外,我們還可以使用内建函數 __import__() 來導入 module。兩者的差別是,import 後面跟的必須是一個類型(type),而__import__() 的參數是一個字元串,這個字元串可能來自配置檔案,也可能是某個表達式計算結果。例如

mymodule = __import__ (’module_name’)

附注:

1)子產品的内容都放在一個子產品檔案中,如 mymodule 的内容應該放在PYTHONPATH 目錄下的一個mymodule.py中,C實作的除外

2)包可以将幾個子產品名稱空間組織起來, 如A.b 就表示在包A中的一個子子產品b

可以單獨導入某一個子子產品,如Python文檔中給出的例子

import sound.effects.echo

這樣必須使用全稱對裡面的對象進行引用,如

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

還可以使用下面的語句來加載echo子子產品

from Sound.Effects import echo

它在沒有包字首的情況下也可以使用, 是以它可以如下方式調用:

echo.echofilter(input, output, delay=0.7, atten=4)

不主張從一個包或子產品中用import * 導入所有子產品,因為這樣的通常會導緻可讀性很差。

from Package import specific_submodule的用法并沒有錯,實際上這還是推薦的用法,除非導入的子產品需要使用其它包中的同名子子產品(the importing module needs to use submodules with the same name from different packages).

綜上所述,一般情況應該使用import , 但有幾個例外

1)module文檔告訴你要用from-import的

2)導入一個包元件。需要一個包裡面的某個子子產品,一般用from A.b import c比import A.b.c 更友善 且不會冒混淆的危險.