Python中的简单时钟类
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)
我想给这个类添加一个叫做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方法是否正确?还有,怎么检查我的函数是否正确呢?
4 个回答
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
获取器和设置器(比如 c.getX() 之类的)在 Python 中并不是很常见。如果需要进行一些转换,可以使用类的属性方法(像上面那样),否则就直接访问属性(就像 Clock.milTime 那样)。
3
我觉得这个看起来没问题,但有两点需要注意。你可能想去掉默认值,因为它们似乎没什么必要。你还需要检查一下值是否在合理范围内,如果超出了范围,就要抛出一个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()
4
你可以在类的构造函数里初始化时间:
Class Clock:
def __init__(self, hours, minutes, seconds):
self._hours = hours
self._minutes = minutes
self._seconds = seconds
....
clk = Clock(12, 34, 2)