班级时钟:
def init (个体经营):
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)
我想在此类中添加一个名为setTime的方法,该方法将小时,分钟和秒作为参数,并对对象的属性进行适当的更改。以下代码使用此类和方法setTime。
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方法是否正确?另外,如何检查我的功能是否正确?
答案 0 :(得分:4)
您可以在类构造函数中初始化时间:
Class Clock:
def __init__(self, hours, minutes, seconds):
self._hours = hours
self._minutes = minutes
self._seconds = seconds
....
clk = Clock(12, 34, 2)
答案 1 :(得分:2)
除了两件事,它对我来说是正确的。您可能想要删除默认值;他们似乎没必要。您希望范围检查值并在ValueError
超出范围时将其提升。
一个简单的测试是将时钟设置为某个东西,然后将数据恢复并检查它;重复几个值。这可以自动化; doctest
模块使用起来非常简单。
编辑:
以下是使用doctest
的示例。测试直接进入模块中任何位置的文档字符串。 doctest.testmod()
查找它们并尝试运行它们,就好像它们是交互式会话一样。如果输出不符合预期,那就是这样说的。如果一切顺利,就没有输出。
class Clock:
"""Clock
Class that acts like a clock.
For doctest -
>>> c = Clock()
>>> c.setTime(23, 59, 59)
>>> c.show()
23:59:59
>>> c.getMinutes()
59
>>> c.setTime(0, 0, 0)
>>> c.show()
0:00:00
# No range or type checking yet
>>> c.setTime(42, 'foo', [1, 2, 3])
# However, the print will fail
>>> c.show()
Traceback (most recent call last):
...
TypeError: int argument required
# Another kind of error
>>> c.setTime(foo=42)
Traceback (most recent call last):
...
TypeError: setTime() got an unexpected keyword argument 'foo'
"""
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)
def setTime(self, hours = 12, minutes = 34, seconds = 2):
self._hours = hours
self._minutes = minutes
self._seconds = seconds
if __name__ == '__main__':
import doctest
doctest.testmod()
答案 2 :(得分:1)
您的setTime
方法是正确的,但是将默认小时,分钟和秒设置为此类任意数字似乎很奇怪。也许小时= 12,分钟= 0,秒= 0会更有意义吗?也许最好完全取消默认值。
您没有任何验证 - 如果有人使用您的课程并且意外地将小时数设置为29?
最后,正如我在评论中提到的,您可以通过尝试来测试您的功能。在简单的情况下它做对了吗?它是否使用默认值做正确的事情?如果你在负秒内投掷会发生什么?你想要发生什么?这些是在测试方法或类时应该考虑的所有事情 - 它是否适用于预期的情况,并且它适用于所有异常/极端情况。
对于您的示例,您可以使用asserts编写一个简单的单元测试:
def testSetTime():
clock = Clock()
clock.setTime(2, 18, 36)
assert clock.getHours() == 2
assert clock.getMinutes() == 18
assert clock.getSeconds() == 36
然后您可以根据需要添加更多测试(请注意,每个单元测试应该只测试一件事。)
答案 3 :(得分:1)
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
Getters和setter(c.getX()等)是非Pythonic;如果需要某些转换,请使用类属性方法(如上所述),否则直接访问属性(与Clock.milTime一样)。