设计班级结构

时间:2016-01-07 11:36:30

标签: python class constructor structure

我是面向对象编程的完全初学者,我有这个奇怪的家庭作业。

基本上是关于圣诞老人,他是如何在某个城市,挨家挨户,给人们送礼物。

我的作业的第一部分是这样的:

写一个班级City

  • 构造函数没有参数。它的作用取决于你:它必须为其他方法准备地形。
  • 方法gift(x, y)记录坐标(x, y)处的房屋收到礼物
  • 如果was_gifted(x, y)的房子得到礼物,方法True会返回(x, y);否则False
  • 方法all_gifted()返回所有获得礼物的房屋的坐标集。

到目前为止,我有这个(并且不知道它是否正确):

class City:
    def __init__(self):
        self.coordinates = set()

    def gift(self, x, y):
        self.coordinates.add((x, y))

    def was_gifted(self, x, y):
        if (x, y) in self.coordinates:
            return True

    def all_gifted(self):
        self.coordinates

我的作业的第二部分是这样的:

写一个班级Santa

  • 构造函数有一个参数,代表圣诞老人将分发礼物的城市。最初,他站在坐标(0, 0)处。
  • 方法move(c)获取角色"v""^""<"">",并向下,向上,向左或向右移动圣诞老人一个字段。协调y这次增加了;即"^"将其增加1,"v"减少它。
  • 方法moves(path)获取一串此类字符并相应地移动圣诞老人。
  • 方法gift()在当前圣诞老人的坐标处给予礼物。请注意gift没有参数(self除外)。

除此之外,写一个类RapidSanta,它来自Santa。它的构造函数得到cityspeedRapidSanta与普通的不同之处在于它不会移动单个字段,而是使用我们在构造函数中设置的speed

有人可以帮助我,因为我甚至不知道如何以及从哪里开始。如果有人知道类似的“问题”,请在论坛上链接或发布。我想掌握这一点,但坦率地说,我不是一个编程天才。提前感谢您的帮助。以下是我的作业必须通过的测试。

import unittest

class TestCity(unittest.TestCase):
    def test_City(self):
        a = City()
        b = City()

        self.assertSetEqual(a.all_gifted(), set())
        self.assertSetEqual(b.all_gifted(), set())
        self.assertFalse(a.is_gifted(1, 3))
        self.assertFalse(b.is_gifted(1, 3))

        a.gift(1, 3)
        self.assertSetEqual(a.all_gifted(), {(1, 3)})
        self.assertSetEqual(b.all_gifted(), set())
        self.assertTrue(a.is_gifted(1, 3))
        self.assertFalse(b.is_gifted(1, 3))

        a.gift(1, 3)
        self.assertSetEqual(a.all_gifted(), {(1, 3)})
        self.assertSetEqual(b.all_gifted(), set())
        self.assertTrue(a.is_gifted(1, 3))
        self.assertFalse(a.is_gifted(-2, -3))
        self.assertFalse(b.is_gifted(1, 3))

        a.gift(-2, -3)
        self.assertSetEqual(a.all_gifted(), {(1, 3), (-2, -3)})
        self.assertSetEqual(b.all_gifted(), set())
        self.assertTrue(a.is_gifted(1, 3))
        self.assertTrue(a.is_gifted(-2, -3))
        self.assertFalse(b.is_gifted(1, 3))

        b.gift(0, 0)
        self.assertSetEqual(a.all_gifted(), {(1, 3), (-2, -3)})
        self.assertSetEqual(b.all_gifted(), {(0, 0)})
        self.assertTrue(a.is_gifted(1, 3))
        self.assertTrue(a.is_gifted(-2, -3))
        self.assertFalse(b.is_gifted(1, 3))
        self.assertTrue(b.is_gifted(0, 0))
        self.assertFalse(a.is_gifted(0, 0))


class TestSanta(unittest.TestCase):
    def test_gift(self):
        m = City()
        n = City()
        b = Santa(m)
        b.gift()
        self.assertSetEqual(m.all_gifted(), {(0, 0)})
        self.assertSetEqual(n.all_gifted(), set())

    def test_move(self):
        m = City()
        n = City()
        b = Santa(m)
        c = Santa(m)
        b.gift()
        self.assertSetEqual(m.all_gifted(), {(0, 0)})
        self.assertSetEqual(n.all_gifted(), set())
        b.move("^")
        b.move("<")
        b.move("<")
        b.gift()
        b.move("v")
        self.assertSetEqual(m.all_gifted(), {(0, 0), (-2, 1)})
        self.assertSetEqual(n.all_gifted(), set())
        c.gift()
        self.assertSetEqual(m.all_gifted(), {(0, 0), (-2, 1)})
        b.gift()
        self.assertSetEqual(m.all_gifted(), {(0, 0), (-2, 1), (-2, 0)})
        b.move(">")
        self.assertSetEqual(m.all_gifted(), {(0, 0), (-2, 1), (-2, 0)})
        b.gift()
        self.assertSetEqual(m.all_gifted(), {(0, 0), (-2, 1), (-2, 0), (-1, 0)})
        c.move("v")
        self.assertSetEqual(m.all_gifted(), {(0, 0), (-2, 1), (-2, 0), (-1, 0)})
        c.gift()
        self.assertSetEqual(m.all_gifted(), {(0, 0), (-2, 1), (-2, 0), (-1, 0), (0, -1)})
        self.assertSetEqual(n.all_gifted(), set())


    def test_moves(self):
        m = City()
        b = Santa(m)
        b.moves("v<<^^^>>>>>")
        b.gift()
        self.assertSetEqual(m.all_gifted(), {(3, 2)})

        cc = ""
        def p(c):
            nonlocal cc
            cc += c
        b.move = p
        b.moves("v<<^^^>>>>>")
        self.assertEqual(
            cc, "v<<^^^>>>>>",
            "Write a method `moves` so that it will use method `move`")

    def test_rapid_Santa(self):
        m = City()
        b = RapidSanta(m, 2)
        c = RapidSanta(m, 3)
        b.gift()
        self.assertSetEqual(m.all_gifted(), {(0, 0)})
        b.move("^")
        b.gift()
        self.assertSetEqual(m.all_gifted(), {(0, 0), (0, 2)})
        b.move("<")
        b.gift()
        self.assertSetEqual(m.all_gifted(), {(0, 0), (0, 2), (-2, 2)})
        c.move("<")
        c.gift()
        self.assertSetEqual(m.all_gifted(), {(0, 0), (0, 2), (-2, 2), (-3, 0)})

    def test_methods(self):
        self.assertIs(RapidSanta.moves, Santa.moves,
                      "RapidSanta has to inherit method moves")
        self.assertIs(RapidSanta.gift, Santa.gift,
                      "RapidSanta has to inherit method gift")

2 个答案:

答案 0 :(得分:0)

首先修复你的City类(nb:假设python 2.x - 不需要继承python 3.x中的object

class City(object):   
    def __init__(self):
        self.coordinates = set()

    def gift(self, x, y):
        self.coordinates.add((x, y))

    def was_gifted(self, x, y):
        return (x, y) in self.coordinates

    def all_gifted(self):
        return self.coordinates

就我而言,Santa类的规格非常明确。您的类需要cityCity}实例和coords实例属性,第一个作为参数传递,第二个默认为(0, 0)

move(self, c)方法会根据字符self.coords的值更新c - 即假设(0, 0)为当前坐标,santa.move('^')应更新{{1}转到self.coords, - (0, 1)方法只需迭代moves(self, moves)并为moves中的每个字符调用self.move(c)

moves方法仅使用当前的coords(实际上是单行)来调用gift(self)

wrt / self.city.gift(),一旦你FastSanta工作,只需要覆盖Santa,这样就可以通过多个单位更新坐标...

我开始使用move()的初始化程序,然后你应该能够尝试实现其他方法 - 如果遇到问题,请发布一个更有针对性的问题:

Santa

编辑:修复更新的OP代码:

class Santa(object):
    def __init__(self, city):
        self.city = city
        self.coords = (0, 0)

为什么要把它变成class Santa(City): 的子类?圣诞老人是城市吗?显然不是......你想要City(python 2.x)或只是class Santa(object):(python 3.x)

class Santa:

命名约定:对类使用 def __init__(self, City): self.city = City ,对实例使用CapNames。这里,第二个参数应该是all_lower 实例,所以它应该是:

City

(剪断)

    def __init__(self, city):
        self.city = city

这将在 def gift(self): self.city.gift 上查找名称“gift” - 它应该产生一个self.city对象 - 丢弃方法对象,然后返回method。你想要的是调用城市的None方法,并将所需的giftx参数传递给它。

要回答您的其他问题(在代码或下面的评论中):

y是一个布尔表达式,在执行(x, y) in self.coordinates语句之前将对其进行评估(替换为有效值)。所以      返回

功能与

完全相同
return

但方式不那么冗长。

wrt / if <some-boolean-expression>: return True else: return False 实际上非常简单,您只需要将FastSanta中使用的默认“移动”值1替换为传递给Santa.move()的值的构造函数。

作为最后一点:您提供的单元测试不仅仅是一种验证代码的方法,它们还为您提供了很多关于预期行为甚至实现的线索,甚至让您测试不同的实现(如FastSanta)的详细和非冗长的实现,如果它们产生相同的结果,你自己找出它们。

答案 1 :(得分:0)

感谢您的回答。首先,我使用的是python 3.4.3。

我更正了这个程序:

if(ValidValue($value))
{
    //do something
}

function ValidValue($value)
{
    if($value < 5) return true;
}

这看起来不错吗?我还没有通过测试运行程序。首先,我想确保我所写的内容实际上是正确的。

我还想问你,你改变了is_gifted(自我,x,y)功能是什么?它会返回真或假或其他任何东西吗?

我不知道如何使用Class FastSanta。我尝试了几种选择,但似乎都没有。

我很抱歉,如果我听起来像完整的菜鸟,但在学校我没有得到任何好的解释,如何工作。只是一些无用的理论。