解释器在寻找什么?

时间:2014-10-29 00:57:45

标签: python class instance

在我遇到下面的练习之前,我从未意识到程序员的糟糕程度。我要编写一个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(),"或者它是我需要在我的" Allergies"中定义的属性?类?

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]

3 个答案:

答案 0 :(得分:1)

  

1)我不理解这个断言结束时的“list”方法。它是内置Python函数“list()”,还是我需要在“Allergies”类中定义的属性?

.开始,您可以确定它是您需要在Allergies类上定义的属性,或者更确切地说,在每个实例上定义。*

  

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_allergenslist_of_allergens不同。)

那么,该列表将来自哪里?好吧,您的班级需要在self.list 某处分配一些东西。并且,由于您的类中唯一被调用的代码是构造函数(__new__)和初始化函数(__init__),因此“某处”非常有限。你可能还没有学过__new__,这意味着你可以选择一个地方,这很简单。


*从技术上讲,你可以在这里使用一个class属性,但这似乎不太可能是他们正在寻找的东西。就此而言,Allergies甚至不必是一个阶级;它可以是一个函数,它只是动态定义一个新类型,构造它,并将list添加到它的dict。但是PEP 8的命名标准和“没有任何理由使事情变得更复杂”都指向了这里的课程。

答案 1 :(得分:1)

这看起来像exercism.io的练习之一。

我已完成练习,所以我知道所涉及的内容。

' list' 应该是类Allergies的类属性,它本身就是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

答案 2 :(得分:1)

从它的使用方式来看,listAllergies返回的对象的一个​​属性,它可以是一个返回一个对象的函数,或者只是调用构造一个{{1}类型的对象的函数。 }。在最后一种情况下,整个事情可以很容易地实现为:

Allergies