2011-11-24 46 views
0

我正在處理這個處理python中的向量的項目。但我是python的新手,並不知道如何破解它。這裏的指令是:python中的向量

「向Vector類添加一個構造函數,構造函數應該只帶一個參數,如果這個參數是一個int類型,或者是一個long類型的實例,參數是Vector實例的長度,在這種情況下,構造一個具有指定長度的Vector,每個元素的初始值爲0.0,如果長度爲負值,則使用適當的消息引發ValueError;如果不考慮參數是長度,那麼如果參數是一個序列(例如一個列表),那麼使用給定序列的長度和值向量初始化。如果參數不被用作向量的長度,並且如果它不是然後用適當的消息引發TypeError。

接下來實現__repr__方法返回可用於初始化Vector的python代碼的字符串。這段代碼應該由類名後面跟着一個開括號,後面跟着一個列表,然後是一個右括號表示向量的內容。「

我不知道如何做類類型。?!檢查,以及如何根據給定的對象初始化向量可能有人請幫助我謝謝你需要開始

+0

可能的重複[什麼是最好的(慣用的)方法來檢查一個Python變量的類型?](http://stackoverflow.com/questions/378927/what-is-the-best-idiomatic-way-來檢查這種類型的python變量) –

回答

0

有許多例子如何在StackOverflow中檢查Python中的類型(請參閱我的評論以獲得最高評分)

初始化類,使用__init__方法:

class Vector(object): 
    def __init__(self, sequence): 
     self._internal_list = list(sequence) 

現在,您可以撥打:

my_vector = Vector([1, 2, 3]) 
Vector

等功能裏面,你可以參考self._internal_list。我在變量名之前加上了_,以表明它不應該從課外改變。

documentation for the list function可能對您有用。

+0

感謝您的快速回復!它適用於序列,但是當參數是一個int或一個long(如Vector(3))時,怎麼樣?那麼結果應該是Vector([0.0,0.0,0.0])? – pew007

+0

@ pew007 - 看看我添加的鏈接,作爲評論如何區分不同的類型。 –

+0

我修好了!謝謝! – pew007

0

您可以使用isinstance進行類型檢查。

一個類的初始化用__init__方法完成。

與分配:-)

2

你的教練好運氣似乎並沒有「說話的Python作爲母語」。 ;)整個課程的概念非常愚蠢;真正的Python程序員只是直接使用內置的序列類型。但是,然後,這種事情是正常的學術演習,可悲...

向Vector類添加構造函數。

在Python中,常見的「這是你如何創建一個新的對象,說什麼這是一個實例」的東西是默認內部處理,然後將嬰兒對象傳遞給類初始化方法通過設置類的新實例應該具有的屬性,使其成爲「適當的」實例。我們稱之爲方法__init__

的構造應該採取一個參數。如果此參數是int或long或從其中一個派生的類的實例

這是通過使用內建函數isinstance進行測試的。您可以在文檔中查找自己(或者在REPL嘗試help(isinstance))。

在這種情況下,構造指定長度的Vector,每個元素初始化爲0.0。

在我們的__init__中,我們通常只指定屬性的起始值。 __init__的第一個參數是我們初始化的新對象,我們通常稱其爲「自我」,以便人們瞭解我們正在做的事情。其餘的參數是調用者請求實例時傳遞的內容。在我們的案例中,我們總是期待一個參數。它可能有不同的類型和不同的含義,所以我們應該給它一個通用名稱。

當我們檢測到泛型參數是isinstance的整數類型時,我們通過設置適當的數據來「構造」向量。我們只分配到的self一些屬性(稱之爲無論是有道理的),和值將被......嗯,你有什麼打算用來內部表示矢量的數據?希望你已經想過了:)

如果長度爲負值,請用適當的消息引發ValueError。

哦,好點...我們應該在我們嘗試構建存儲之前檢查一下。一些顯而易見的方法可以基本上將負數視爲零。其他方式可能會引發我們無法控制的異常情況。

如果參數不被認爲是長度,那麼如果參數是一個序列(例如列表),則使用具有給定序列的長度和值的向量進行初始化。

「序列」是一個非常模糊的概念;列表和元組以及什麼 - 沒有「序列」基類,所以我們不能用isinstance來輕鬆檢查。 (畢竟,有人可以很容易地發明一種我們沒有想到的新的序列)。要檢查,如果事情是一個序列的最簡單的方法是嘗試爲它創建一個迭代器,具有內置iter功能。如果這個東西不是可迭代的(嘗試它!),這將會產生一個相當有意義的TypeError,這樣就可以很容易地處理錯誤 - 我們只是讓它做它的事情。

假設我們有一個迭代器,我們可以輕鬆地創建我們的存儲:大多數序列類型(我假設你有他們的一記已經和一個肯定是包括在內)將接受他們__init__方法的迭代器並做複製序列數據的明顯事情。

接下來執行__repr__方法返回一個可用於初始化Vector的python代碼的字符串。這串代碼應該由類名後面跟着一個開括號,然後是表示爲列表的內容,然後是一個右括號。「

希望這是不言自明的。提示:你應該可以通過使用存儲屬性自己的__repr__來簡化這個問題,也可以考慮使用字符串格式將字符串放在一起

+0

-1請停止傳播這個Python沒有構造函數的錯誤信息,或者'__new__'是一個錯誤信息。當你在Python中調用'SomeClass(s​​ome,args)'時,系統神奇地創建一個'空白'對象,然後'SomeClass'的'__init__'方法得到控制來填充空白對象。這完全是**構造函數如何在Java/C++中工作;該對象在構造函數代碼獲得控制權時已存在,由系統提供。 '__init__'的官方Python文檔甚至在此將其引用爲構造函數:http://docs.python.org/reference/datamodel.html#basic-customization – Ben

+0

無法顯式調用Java和C++中的構造函數。 Python的'__init__'可以(儘管你顯然不應該)。定義是主觀的,系統的確有不同的工作。Python中沒有任何東西與C++初始化列表非常相似,或者Java爲成員或實例初始化塊設置了默認值。我不認爲它是錯誤的信息,我發現你的指責相當有害。 –

+0

我並不是說我認爲你做到了,或者你說的如此惡毒。但是這個想法是從某處開始的,大量非常聰明的經驗豐富的Python程序員不斷重複「__init__」不是構造函數,因爲它不創建對象,只是初始化「,而沒有真正考慮它。最重要的是,'__new__'是一個構造函數是荒謬的;它不像Java/C++構造函數。 – Ben

0

這可能也可能不合適,這取決於作業,但是在Python編程中它不是非常常見的是明確地檢查一個參數的類型並根據它改變行爲。只是嘗試使用你期望它的特性更爲正常(可能捕獲異常f必須回退到其他選項)。

在這個特殊的例子,一個普通的Python程序員實現一個需要工作這樣一個向量會嘗試使用參數彷彿它是一個整數/長(提示:如果你用一個整數乘以一個列表會發生什麼?)初始化Vector,如果拋出異常請嘗試使用它好像它是一個序列,如果失敗了,那麼你可以拋出TypeError

做這件事的原因是它讓你的課程開放,以便與其他對象類型一起工作,後來人們提出的對象類型不是整數或序列,而是像他們一樣工作。特別是,要全面檢查某些東西是否是「序列」是非常困難的,因爲可以用作序列的用戶定義類不一定是您可以檢查的任何常見類型的實例。例如,Vector類本身就非常適合用來初始化Vector。

但我不確定這是否是您的老師所期待的答案。如果您還沒有學習異常處理,那麼您幾乎肯定不打算使用這種方法,所以請忽略我的文章。祝你好運!