我是面向对象编程的完全初学者,我有这个奇怪的家庭作业。
基本上是关于圣诞老人,他是如何在某个城市,挨家挨户,给人们送礼物。
我的作业的第一部分是这样的:
写一个班级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")
答案 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
类的规格非常明确。您的类需要city
(City
}实例和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
方法,并将所需的gift
和x
参数传递给它。
要回答您的其他问题(在代码或下面的评论中):
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。我尝试了几种选择,但似乎都没有。
我很抱歉,如果我听起来像完整的菜鸟,但在学校我没有得到任何好的解释,如何工作。只是一些无用的理论。