2014-10-29 41 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