我是一个完全的面向对象编程初学者,我有一个奇怪的家庭作业。你知道吗
基本上是关于圣诞老人,他是如何在某个城市,走家串户,给人们礼物。你知道吗
我作业的第一部分是这样的:
写一个类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
派生的。它的构造函数得到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")
首先修复
City
类(注意:假设python 2.x-不需要从python 3.x中的object
继承)在我看来,
Santa
类的规范非常清楚。您的类将需要一个city
(实例City
)和coords
实例属性,第一个作为参数传递,第二个默认为(0, 0)
。你知道吗move(self, c)
方法将根据字符c
的值更新self.coords
,即假定(0, 0)
为当前坐标,santa.move('^')
应该将self.coords
更新为(0, 1)
,-而moves(self, moves)
方法只是迭代moves
并为moves
中的每个字符调用self.move(c)
。你知道吗gift(self)
方法仅使用当前坐标调用self.city.gift()
(实际上是一个单行程序)。你知道吗请注意,
FastSanta
,一旦Santa
工作,只需覆盖move()
,这样坐标就会被多个单位更新。。。你知道吗我从
Santa
的初始值设定项开始,然后您应该能够尝试并实现其他方法—如果您有问题,可以发布一个更集中的问题:编辑:修复更新的操作码:
为什么要把它变成
City
的子类???圣诞老人是一座城市吗???显然不是。。。你想要class Santa(object):
(python2.x)或者仅仅class Santa:
(python3.x)命名约定:类使用
CapNames
,实例使用all_lower
。这里,第二个参数应该是City
实例,因此应该是:(剪)
这将在
self.city
上查找名称“gift”,这将产生一个method
对象,丢弃方法对象,并返回None
。这里需要调用城市的gift
方法,传递所需的x
和y
参数。你知道吗要回答您的其他问题(在代码或下面的注释中):
(x, y) in self.coordinates
是一个布尔表达式,在执行return
语句之前,它将被求值(替换为有效值)。所以呢 返回功能与
但以一种不那么冗长的方式。你知道吗
wrt/
FastSanta
实际上非常简单,您只需将Santa.move()
中使用的默认“移动”值1
替换为传递给FastSanta
的构造函数的值。你知道吗最后一点:提供给您的单元测试不仅仅是验证代码的一种方法,它们还为您提供了许多有关预期行为甚至实现的线索,甚至让您测试不同的实现(比如
was_gifted()
的详细和非详细实现),并自己找出它们是否产生同样的结果。你知道吗谢谢你的回答。首先,我使用的是python3.4.3。你知道吗
我纠正了这个程序如下:
这个看起来好吗?我还没有通过测试运行一个程序。首先我要确定我写的东西是正确的。你知道吗
我还想问你,你改变了什么天赋(self,x,y)功能?它会返回真或假或其他什么吗?你知道吗
我不知道该怎么办。我试过几个选择,但没有一个是好的。你知道吗
我很抱歉,如果我听起来像一个彻头彻尾的傻瓜,但在学校我没有得到任何很好的解释,事情是如何运作的。只是一些无用的理论。你知道吗
相关问题 更多 >
编程相关推荐