你的教練好運氣似乎並沒有「說話的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__
來簡化這個問題,也可以考慮使用字符串格式將字符串放在一起
可能的重複[什麼是最好的(慣用的)方法來檢查一個Python變量的類型?](http://stackoverflow.com/questions/378927/what-is-the-best-idiomatic-way-來檢查這種類型的python變量) –