2015-03-31 48 views
3

我有以下目錄結構:Python模塊VS班

ican/ 
    __init__.py 
    haz/ 
    __init__.py 
    apple.py 
    grape/ 
     __init.py 
     grape.py 

其中apple.pygrape.py有水果類定義。在另一個測試文件中,我嘗試通過類似myapple = ican.haz.apple()mygrape = ican.haz.grape()的方式加載水果類。

什麼是正確的目錄結構和加載這種類的import結構?我也嘗試過類似import ican.haz as icanhaz,然後致電myapple = icanhaz.apple()。我期待把我所有的課程放在同一個地方,並通過類似ican.haz.<class>的方式加載它們。

+0

它認爲值得指出的是,在Python中,你沒有義務將每個類放在它自己的模塊中(比如你通常在Java中)。如果你的'Apple'和'Grape'類很簡單,你可能想把它們的代碼放在同一個文件中(也許是'ican/has.py'),讓你擺脫很多你的子包。 – Blckknght 2015-03-31 20:11:41

回答

0

是均勻的,無論是

一個)apple.py應該在一個apple文件夾低一個級別與init,或

b)中grape.py應該是一個電平高,而不是在它自己的grape文件夾。

然後您的進口將是from ican.haz.apple import Applefrom ican.haz.grape import Grape(對於選項a);或from ican.haz import apple, grape(對於選項b)。

要獲得所需的結構,請使用選項b並修改init下的haz

haz/__init__.py

from .apple import Apple 
from .grape import Grape 

__all__ = ['Apple', 'Grape'] 

你會(雖然認爲是不好的風格)導入爲import ican.haz.*。這是〜模塊與類的名稱〜(不再更多,因爲類名更正)。使用選項a或b更好地使用下面的一行。

順便說一下,根據您當前的結構,進口將需要:

from ican.haz import apple 
from ican.haz.grape import Grape 

a = apple.Apple() 
g = Grape() 
+0

當我嘗試以這種方式導入'apple'時,我得到'TypeError:'模塊'對象不可調用'。但是,如果我使用'from ican.haz.apple將Apple導入Apple',則可以創建'a = Apple()'。爲什麼這個工作,但你的方式沒有? – drjrm3 2015-03-31 18:11:51

+0

因爲你的類'Apple'在文件(模塊)'apple'內。 〜將更新我的答案以區分大小寫的正確性〜在完成多次編輯後,在手機上輸入代碼和降價並不那麼容易。 – aneroid 2015-03-31 18:22:37

1

你混淆了兩個概念。一個python「模塊」是一個包含python代碼的文件,可以導入。一個python「class」是可以在模塊中定義的東西。

在你的例子中,applegrape是模塊。您不能通過執行諸如apple()之類的操作來調用模塊,這是不允許的。您需要導入模塊中包含的類。

所以說apple.py有一個在其中定義的GetApple類。所以apple.py是這樣的:

class GetApple(object): 
    def __init__(self): 
     print("I have an apple!") 

模塊也可以具備的功能,讓你可以有一個GetApple函數:

def GetApple(): 
    print("I have an apple!") 

模塊也可以有變量。他們可以有任何數量的變量,類和函數。您可以單獨導入它們(例如使用from apple import GetApple或導入模塊並從模塊import apple訪問它們。但是你不能導入,然後調用一個模塊(至少不能以任何合理的方式),只能調用它的函數或類。

爲了您的目錄結構,你可以把它使用任何這些方法,然後運行:

>>> from ican.haz.apple import GetApple 
>>> GetApple() 
I have an apple! 

>>> from ican.haz import apple 
>>> apple.GetApple() 
I have an apple! 

>>> import ican.haz.apple 
>>> ican.haz.apple.GetApple() 
I have an apple! 

,並根據您的__init__.py文件,也可能是:

>>> import ican.haz 
>>> ican.haz.apple.GetApple() 
I have an apple! 

>>> import ican 
>>> ican.haz.apple.GetApple() 
I have an apple! 

對於grape.py,假設相應的類,這種事情會起作用:

>>> from ican.haz.grape.grape import GetGrape 
>>> GetGrape() 
I have a grape!