python中的一个简单时钟类

python中的一个简单时钟类,python,Python,我想向这个类添加一个名为setTime的方法,它以小时、分钟和秒为参数,并对对象的属性进行适当的更改。下面的代码使用这个类和方法setTime Class Clock: def __init__(self): self._hours = 12 self._minutes = 0 self._seconds = 0 def getHours(self): return self._hours def

我想向这个类添加一个名为setTime的方法,它以小时、分钟和秒为参数,并对对象的属性进行适当的更改。下面的代码使用这个类和方法setTime

Class Clock:   
    def __init__(self):
        self._hours = 12
        self._minutes = 0
        self._seconds = 0

    def getHours(self):
        return self._hours

    def getMinutes(self):
        return self._minutes

    def getSeconds(self):
        return self._seconds

    def show(self):
        print "%d:%02d:%02d" % (self._hours, self._minutes, self._seconds)

我的问题是我的设置时间方法是否正确?另外,如何检查我的函数是否正确?

除了两件事之外,我觉得它是正确的。您可能希望删除默认值;它们似乎没有必要。您希望对值进行范围检查,如果值超出范围,则引发ValueError

一个简单的测试是将时钟设置为某个值,然后获取数据并进行检查;重复几个值。这可以自动化;doctest模块使用起来相当简单

编辑:

下面是一个使用doctest的示例。测试直接进入模块中任何位置的docstring。testmod查找它们,并尝试将它们当作交互式会话来运行。如果输出不符合预期,它会这样说。如果一切顺利,就没有产出

clk = Clock()
clk.setTime(12, 34, 2)
print clk.getHours()
clk.show()

    def setTime(self, hours = 12, minutes = 34, seconds = 2):
        self._hours = hours
        self._minutes = minutes
        self._seconds = seconds
您的setTime方法是正确的,但是将默认的小时、分钟和秒设置为这样的任意数字似乎有些奇怪。也许小时=12,分钟=0,秒=0更有意义?也许甚至完全取消默认值也是最好的

您没有任何验证-如果有人使用您的类并意外地将小时数设置为29,该怎么办

最后,正如我在评论中提到的,您可以通过尝试来测试您的函数。在简单的情况下,它是否做了正确的事情?它使用默认值做正确的事情吗?如果你掷负秒会发生什么?你想发生什么?这些都是测试一个方法或类时应该考虑的事情——它是否在预期的情况下工作,并且它在所有特殊的/角落的情况下工作。

对于您的示例,您可以编写一个简单的单元测试,如下所示:


然后,您可以根据需要添加更多测试请注意,每个单元测试只应测试一件事。

您可以在类构造函数中初始化时间:

def testSetTime():
    clock = Clock()
    clock.setTime(2, 18, 36)
    assert clock.getHours() == 2
    assert clock.getMinutes() == 18
    assert clock.getSeconds() == 36
然后


getter和setter c.getX等是非Pythonic的;如果需要一些转换,请使用如上所述的类属性方法,否则直接使用Clock.milTime访问属性。

您可以通过尝试来检查函数是否正确。这叫做测试;在这种情况下,您甚至可以编写一个测试,只需一个小注释,开始时使用的class关键字应该都是小写的class,而不是class。这可能是一个输入错误,但是,因为你似乎还没有运行代码。既然我不知道如何创建测试函数,你能提供一个模块来编写测试函数吗?@hkus10,我们不是来为你做东西的,而是帮你做的。如果你想有人为你写一个模块,请雇佣一个自由职业者。我们花了很多时间回答你的问题,我们预计不会得到回报。所以请谅解。如果您不知道如何创建模块来编写测试函数,请进行一些研究。首先,你可以用谷歌搜索它,然后你会得到很多对你有帮助的结果。我重复一遍,我们不是来为你的项目编码的,而是来帮助你的。谢谢
def testSetTime():
    clock = Clock()
    clock.setTime(2, 18, 36)
    assert clock.getHours() == 2
    assert clock.getMinutes() == 18
    assert clock.getSeconds() == 36
Class Clock:   
    def __init__(self, hours, minutes, seconds):
        self._hours = hours
        self._minutes = minutes
        self._seconds = seconds
....


clk = Clock(12, 34, 2)
class Clock(object):
    def __init__(self, hour=12, minute=0, second=0, milTime=False):
        super(Clock,self).__init__()
        self.hour    = hour
        self.minute  = minute
        self.second  = second
        self.milTime = milTime  # 24-hour clock?

    @property
    def hour(self):
        return self._hour if self.milTime else ((self._hour-1) % 12)+1

    @hour.setter
    def hour(self, hour):
        self._hour = hour % 24

    @property
    def minute(self):
        return self._minute

    @minute.setter        
    def minute(self, minute):
        self._minute = minute % 60

    @property
    def second(self):
        return self._second

    @second.setter
    def second(self, second):
        self._second = second % 60

    @property
    def time(self):
        return self.hour, self.minute, self.second

    @time.setter
    def time(self, t):
        self.hour, self.minute, self.second = t

    def __str__(self):
        if self.milTime:
            return "{hr:02}:{min:02}:{sec:02}".format(hr=self.hour, min=self.minute, sec=self.second)
        else:
            ap = ("AM", "PM")[self._hour >= 12]
            return "{hr:>2}:{min:02}:{sec:02} {ap}".format(hr=self.hour, min=self.minute, sec=self.second, ap=ap)
c = Clock(12, 15, 10)
print c                 # -> 12:15:10 PM
c.milTime = True
print c                 # -> 12:15:10
c.hour = 9
print c                 # -> 09:15:10
c.milTime = False
print c                 # -> 9:15:10 AM
c.time = 12,34,2
print c                 # -> 12:34:02 PM