简单定制
class roundFloatManual(object):
def __init__(self,val):
assert isinstance(val, float),\
'value must be float'
self.value = round(val, 2)
def __str__(self):
return '%.2f' % self.value
__repr__ = __str__
rfm = roundFloatManual(4.25344)
print rfm
覆盖__str__ 方法,如果没有对这个方法覆盖的话我们直接print rfm 不能得到想要的结果, 覆盖之后我们就能得到我们想要的结果了。然后再把__repr__作为
__str__ 的一个别名,以保证解释器在转储(dump) 对象时也能正确显示
数值定制 Time60
创建一个简单的应用, 用来操作时剑,精确到小时和分钟,可用来跟踪员工工作时间, ISP用户在线时间,数据库运行时间等等
class Time60(object):
def __init__(self, hr, min):
self.hr = hr
self.min = min
将小时和分钟传给构造器
同样,我们需要一个有意义的输出,如同上一个例子,我们都看惯了小时和分钟,用冒号分开的格式
def __str__(self):
return "%d:%d" % (self.hr, self.mins)
__str__ = __repr__
加法
python的重载操作符很简单, 像加号, 只需要重载__add__ 方法, 实现这个并不困难, 复杂性源于我们怎么处理这个新的总数,我们的方法是创建出来一个新的结果并且储存进去计算出来的总数
def __add__(self, other):
return self.__class__ (self.hr + other.hr,
self.mins + other.mins)
原位操作, 我们也许还想覆盖原位操作, 比如 __iadd__ 来支持像+=这样的操作符
def __iadd__(self, other):
self.hr += other.hr
self.mins += other.mins
return self
然后我们测试一下我们的类
mon = Time60(10, 30)
tue = Time60(11, 15)
print mon, tue
print mon + tue
mon += tue
print mon
结果
10:30 11:15
21:45
21:45
看起来非常完美了?
进一步优化,我们不传入两个分离的参数, 而是传入一个二元组,而且这个不支持分钟的六十进制