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
看起来非常完美了?
进一步优化,我们不传入两个分离的参数, 而是传入一个二元组,而且这个不支持分钟的六十进制
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
看起来非常完美了?
进一步优化,我们不传入两个分离的参数, 而是传入一个二元组,而且这个不支持分钟的六十进制
相关文章推荐
- 【Python基础】Python面向对象 - 4 - 定制类的特殊方法
- Python 定制类的特殊方法与授权
- python中实现定制类的特殊方法总结
- python中的用来定制类的特殊方法的含义
- python中的用来定制类的特殊方法的含义
- python 新式类学习随笔-定制类的特殊方法(1)
- python中实现定制类的特殊方法总结
- Python 定制类 特殊方法
- 整理Python(定制类&特殊方法)
- [Python]用来定制类的特殊方法
- python特殊方法定制类
- python学习(7)定制类的特殊方法
- python中实现定制类的特殊方法总结
- python 新式类的学习随笔-定制类的特殊方法(2)
- Python学习29:使用特殊的方法定制类(类似于c++的运算符重载)
- python特殊属性和方法的运用
- python 教程 第十三章、 特殊的方法
- Python深入01 特殊方法与多范式
- 简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他
- python 教程 第十三章、 特殊的方法