设计班级结构

2024-09-30 05:19:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

基本上是关于圣诞老人,他是如何在某个城市,走家串户,给人们礼物。你知道吗

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

写一个类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")

Tags: 方法selfcitymoveisdefallsanta
2条回答

首先修复City类(注意:假设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)方法将根据字符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的初始值设定项开始,然后您应该能够尝试并实现其他方法—如果您有问题,可以发布一个更集中的问题:

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

编辑:修复更新的操作码:

class Santa(City):

为什么要把它变成City的子类???圣诞老人是一座城市吗???显然不是。。。你想要class Santa(object):(python2.x)或者仅仅class Santa:(python3.x)

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

命名约定:类使用CapNames,实例使用all_lower。这里,第二个参数应该是City实例,因此应该是:

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

(剪)

    def gift(self):
        self.city.gift

这将在self.city上查找名称“gift”,这将产生一个method对象,丢弃方法对象,并返回None。这里需要调用城市的gift方法,传递所需的xy参数。你知道吗

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

(x, y) in self.coordinates是一个布尔表达式,在执行return语句之前,它将被求值(替换为有效值)。所以呢 返回

功能与

 if <some-boolean-expression>:
     return True
 else:
     return False

但以一种不那么冗长的方式。你知道吗

wrt/FastSanta实际上非常简单,您只需将Santa.move()中使用的默认“移动”值1替换为传递给FastSanta的构造函数的值。你知道吗

最后一点:提供给您的单元测试不仅仅是验证代码的一种方法,它们还为您提供了许多有关预期行为甚至实现的线索,甚至让您测试不同的实现(比如was_gifted()的详细和非详细实现),并自己找出它们是否产生同样的结果。你知道吗

谢谢你的回答。首先,我使用的是python3.4.3。你知道吗

我纠正了这个程序如下:

class City:

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 # Does this return True or False?????

def all_gifted(self):
    return self.coordinates


class Santa(City):

def __init__(self, City):
    self.city = City
    self.coords = (0, 0)

def move(self, c):
    if c == "^":
        self.coords[1] -= 1
    elif c == "ˇ":
        self.coords[1] += 1
    elif c == "<":
        self.coords[0] -= 1
    elif c == ">":
        self.coords[0] += 1

def moves(self, path):
    for i in path:
        self.move(i)

def gift(self):
    self.city.gift

class FastSanta:
?????????????

这个看起来好吗?我还没有通过测试运行一个程序。首先我要确定我写的东西是正确的。你知道吗

我还想问你,你改变了什么天赋(self,x,y)功能?它会返回真或假或其他什么吗?你知道吗

我不知道该怎么办。我试过几个选择,但没有一个是好的。你知道吗

我很抱歉,如果我听起来像一个彻头彻尾的傻瓜,但在学校我没有得到任何很好的解释,事情是如何运作的。只是一些无用的理论。你知道吗

相关问题 更多 >

    热门问题