python 用特殊方法定制类

简单定制


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

看起来非常完美了?

进一步优化,我们不传入两个分离的参数, 而是传入一个二元组,而且这个不支持分钟的六十进制



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值