2012-02-29 30 views
1
/projects/mymath$ ls 
__init__.py __init__.pyc mymath.py mymath.pyc tests 

和目錄tests下我有如何導入我的模塊?

/projects/mymath/tests/features$ ls 
steps.py steps.pyc zero.feature 

我試圖導入我的階乘函數

sys.path.insert(0,"../../") 
#import mymath 
from mymath.MyMath import factorial 

但它表示無模塊命名MYMATH。

這是我的假人MyMath class。

class MyMath(object): 

     def factorial(self, number): 
       if n <= 1: 
         return 1 
       else: 
         return n * factorial(n-1) 

那麼,怎麼了?謝謝。這是連一個很好的做法(編輯SYS路徑?)

這將工作import mymath

+1

您不能從'MyMath'中導入'factorial',因爲'MyMath'是它自己的*類*。你可以從'mymath'作爲模塊名稱'導入'*頂級*對象。所以你可以通過mymath import MyMath來完成,就是這樣。如果你想導入階乘,然後把它帶出*類,然後你可以從'mymath import factorial'(如果你把它放在'mymath.py'中)。 – 2012-02-29 23:41:40

+0

部分重複: http:// stackoverflow。COM /問題/ 9011545 /蟒蛇,相對進口中之 - 封裝 - 不 - 上的路徑 – 2012-02-29 23:42:26

回答

2

從我可以告訴,這是正確的。沒有名爲mymath.MyMath的模塊。有一個名爲mymath.mymath的模塊雖然...

爲了明確起見,當您創建一個文件夾並在其中放入一個__init__.py文件時,您已經創建了一個包。如果您的__init__.py文件爲空,那麼您仍然必須顯式導入包中的模塊。因此,您必須執行import mymath.mymath以將mymath模塊導入您的名稱空間。然後你可以通過mymath.mymath.MyMath訪問你想要的東西,等等。如果你想直接導入類,你必須這樣做:

from mymath.mymath import MyMath 

正如別人已經解釋的,你不能從一個類導入方法。你必須導入整個班級。

4

您不能從類中導入函數。您想要導入類本身(import mymath.mymath.MyMath)或將該功能置於模塊級別並執行import mymath.mymath.factorial

2

一個問題是您的導入是錯誤的。你有一個叫mymath的包,裏面有一個叫做mymath的模塊。在這個模塊是一個類。這是最可以導入:

>>> from mymath.mymath import MyMath 
>>> myMathObject = MyMath() 
>>> myMathObject.factorial(5) 
120 

另一個問題是你的第二個電話階乘應該呼籲self因子,否則會嘗試看看它的模塊中的免費功能,這是行不通的。嘗試一下!

0

這是我的假MyMath類。

Python不是Java;該類不是任何類型的組織單元,而只是數據類型的藍圖。沒有理由在這裏定義一個類(無論如何它都必須被實例化);只需將factorial函數定義爲函數即可。