2014-10-29 31 views
0

我從來沒有意識到我是一個程序員,直到我遇到下面這個練習。我將編寫一個Python文件,允許下面的所有測試通過而不會出錯。口譯員在找什麼?

我相信我寫的文件需要是一個類,但我完全不知道我的班上應該寫些什麼。我知道問題在問什麼,但不知道如何製作課程,或者如何使用適當的對象來響應對課程的調用。

請查看下面的練習代碼,然後在最後看到我的問題。

文件與測試:

import unittest 
from allergies import Allergies 

class AllergiesTests(unittest.TestCase): 

    def test_ignore_non_allergen_score_parts(self): 
     self.assertEqual(['eggs'], Allergies(257).list) 


if __name__ == '__main__': 
    unittest.main() 

1)我不明白,在這個斷言的末尾的「清單」的方法。它是內置Python函數「list()」,還是我需要在「過敏」類中定義的屬性?

2)什麼類型的對象是 「過敏(257).LIST」

self.assertEqual(['eggs'], Allergies(257).list) 

3)我通過定義像下面的東西接近這個?

def list(self): 
     list_of_allergens = ['eggs','pollen','cat hair', 'shellfish'] 
     return list_of_allergens[0] 

回答

1

1)我不明白,在這個斷言的末尾的「清單」的方法。它是內置Python函數「list()」,還是我需要在「過敏」類中定義的屬性?

.,你可以說這是你需要定義你的​​類或者更確切地說,它的每個實例。*

2)什麼類型的對象的屬性是「過敏(257).list」

那麼,它應該比較什麼等於? ['eggs']是一個字符串列表(字符串)。因此,除非您要創建一個喜歡與列表進行比較的自定義類型,否則您需要一個列表。

3)我是否通過定義如下的方法來解決這個問題?

def list(self): 
    list_of_allergens = ['eggs','pollen','cat hair', 'shellfish'] 
    return ist_of_allergens 

號你在錯誤的軌道了蝙蝠的權利上。這將使Allergies(257).list成爲方法。即使該方法在被調用時返回一個列表,測試驅動程序也不會調用它。它必須是一個列表。 (而且,更爲明顯,['eggs','pollen','cat hair', 'shellfish']不會比等於['eggs'],並ist_of_allergens是不一樣的東西list_of_allergens。)

那麼,其中該名單從哪兒來?那麼,你的班級將需要分配self.list某處。而且,由於您的類中唯一被調用的代碼是您的構造函數(__new__)和初始值設定項(__init__),因此「某處」相當有限。而你可能還沒有學到__new__,這意味着你可以選擇一個地方,這很簡單。


*從技術上講,你可以使用一個類屬性在這裏,但似乎不太可能,他們在尋找什麼。對於這個問題,​​甚至不必是一個類;它可能是一個函數,只是定義一個新類型,構造它,並將list添加到它的字典中。但是PEP 8的命名標準和「不要讓事情變得更加複雜」都指向想在這裏上課。

+0

是的我看到了錯字/語法錯誤。它應該是「list_of_allergens [0]」「過敏(257).list」中的點使我認爲這是一種「方法」,但是你說它是一個「屬性」。這大大幫助我分離出兩個概念:) – 2014-10-29 01:39:42

+0

@ user1473511:方法是一種屬性。鬆散地說,你可以把它們看作可以像函數一樣調用的屬性,並且通常像函數那樣定義。 (要嚴格地說,你必須理解描述符和你不想學習的描述符和類屬性訪問規則。) – abarnert 2014-10-29 18:28:19

1

這看起來像是exercism.io中的練習之一。

我已經完成了練習,所以我知道涉及什麼。

'list'應該是過敏類的類屬性,它本身也是list類型的對象。至少這是處理它的一種直接方式。我在課程的__init__方法中定義了它。在我看來,他們稱之爲'list',因爲這與Pythons list類型衝突。從我的回答

片段:

class Allergies(object): 

    allergens = ["eggs", "peanuts", 
       "shellfish", "strawberries", 
       "tomatoes", "chocolate", 
       "pollen","cats"] 

    def __init__(self, score): 
     # score_breakdown returns a list 
     self.list = self.score_breakdown(score) # let the name of this function be a little clue ;) 

如果我是你,我會去做一些Python教程。我會從基礎開始,即使感覺你正在覆蓋你已經旅行過的地面。儘可能紮實地瞭解您的基礎知識和基礎知識是絕對值得的。爲此,我可以推薦Udacitycodeacademy

+0

是的,它是Exerciseism.io的練習。正如你指出的那樣,我被使用「列表」弄糊塗了。我也不知道,就像你們三位都指出的那樣,「self.list」是語法的結果。我已經通過了Python上的2個Udacity類,並且都沒有處理類! – 2014-10-29 01:34:47

+1

很久以前,我在Udacity做過'計算機科學入門',當時在課程結束時處理了課程(我不知道它是否仍然存在)。他們絕對是讓我的頭腦變得更強硬的概念之一,這是肯定的。繼續前進,不要停止:) – Totem 2014-10-29 01:46:34

+0

那麼,在「過敏(257).list」和「allergies.is_allergic_to('草莓')」之間,語法上的區別是什麼?「如果我嘗試寫」self.is_allergic_to「錯誤,說明它不可調用。 「is_allergic_to」是過敏症的一種方法(功能),而「list」僅僅是一個屬性?我看不出語法中的區別。 – 2014-10-29 02:06:17

1

從它的使用方法來看,list是​​返回的對象的一個​​屬性,它可能是一個函數,它返回一個對象或者只是調用構造一個類型爲​​的對象。在這最後一種情況下,整個事情可以很容易實現爲:

class Allergies: 
    def __init__(self, n): 
     # probably you should do something more 
     # interesting with n 
     if n==257: 
      self.list=['eggs'] 
+0

你的簡潔的例子還顯示「self.list」,從你們所有三個人中,我都能夠推斷出我必須做的事情。 – 2014-10-29 01:46:02