您的位置:首页 > 编程语言 > Python开发

python 用特殊方法定制类

2014-10-23 13:29 274 查看
简单定制

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

看起来非常完美了?

进一步优化,我们不传入两个分离的参数, 而是传入一个二元组,而且这个不支持分钟的六十进制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: