【发布时间】:2016-01-07 11:36:30
【问题描述】:
我是面向对象编程的完全初学者,我有一个奇怪的家庭作业。
基本上是关于圣诞老人,他如何在某个城市,挨家挨户地向人们赠送礼物。
我的作业的第一部分是这样的:
写一个类City。
- 构造函数没有参数。它的作用取决于您:它必须为其他方法准备地形。
- 方法
gift(x, y)记录坐标(x, y)的房子收到了礼物 - 如果
(x, y)的房子收到礼物,方法was_gifted(x, y)返回True;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向上增加;即"^"将其增加一,"v"将其减少。 - 方法
moves(path)获取一串这样的字符并相应地移动圣诞老人。 - 方法
gift()向位于当前圣诞老人坐标的房子赠送礼物。请注意,gift没有参数(self除外)。
除此之外,编写 classRapidSanta,它派生自 Santa。它的构造函数得到city 和speed。 RapidSanta 与普通的不同之处在于它不会按单个字段移动,而是使用我们在构造函数中设置的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")
【问题讨论】:
-
我觉得这个问题有点太笼统了,你能缩小范围吗?有什么问题,Python OOP 还是任务?就个人而言,我认为“它的作用取决于您:它必须为其他方法准备地形。”当您开始使用 OOP 时,这只是一个可怕的练习。任务本身应该更清楚。如果我是你,我会尝试将其分解为可以自行解决的子任务,并就这些问题提出几个更具体的问题,因为完整的练习相当冗长,很少有人会全部阅读。在继续编码之前画出一个基本的类图可能会有所帮助。
标签: python class constructor structure