2013-09-01 75 views
7

我對如何使用numpy的庫有問題。當我導入numpy時,我可以訪問許多內置的類,函數和常量,例如numpy.array,numpy.sqrt等。具有子模塊和功能的Python模塊

但是在numpy中還有其他子模塊,如numpy.testing。

這是如何完成的?在我有限的經驗中,帶有子模塊的模塊只是一個帶有init .py文件的文件夾,而帶有函數/類的模塊是實際的python文件。如何創建一個也有函數/類的模塊「文件夾」?

回答

17

具有.py文件和__init__.py的文件夾被稱爲package。其中一個包含類和函數的文件是module。文件夾嵌套可以爲您提供子包。

因此,舉例來說,如果我有以下結構:

mypackage 
    __init__.py 
    module_a.py 
    module_b.py 
     mysubpackage 
      __init__.py 
      module_c.py 
      module_d.py 

我可以導入mypackage.module_amypackage.mysubpacakge.module_c等。

您也可以通過將代碼放入__init__.py中,將函數添加到mypackage(如您提到的numpy函數)。雖然這通常被認爲是醜陋的。

如果你看看numpy's __init__.py,你會看到很多代碼 - 其中很多是定義這些頂級類和函數。 __init__.py代碼是加載包時首先執行的代碼。

+0

那麼它是如何導入類似numpy或scipy的庫,並且包含類/函數(如模塊)和其他模塊(如包)。 所以我可以做numpy.array(一個類)或numpy.testing.assert ...(獲取一個模塊)。 – ImpGuard

+0

我剛剛回答說,它都在'__init __。py'中。當解釋器加載該包時,其中的任何函數都會有該包的頭等成員。 –

+0

啊,這就是我想知道的。我認爲這會被認爲是醜陋的,因爲很多雜項。邏輯會進去。我認爲所有的東西都是單獨編碼的,不知何故合併成__init__.py之後? 有這樣的東西似乎相當有用,但我不知道如何複製它,而不只是在一個文件中轉儲大量的代碼。 – ImpGuard