第13章 面向对象编程(12)

13.13 用特殊方法定制类

特殊方法允许类通过重载标准操作符+,*,甚至包括分段下标及映射操作[]来模拟标准类型。如同其他很多保留标识符,这些方法都是以双下划线(__)开始及结尾的。

13.13.1 简单定制(RoundFloat2)

>>> class RoundFloatManual(object):
... 	def __init__(self, val):
... 		assert isinstance(val, float), "value must be a float!"
... 		self.value = val
... 	def __str__(self):
... 		return '%.2f'%self.value
... 	def __repr__(self):
... 		return self.__str__()
... 	
>>> value = RoundFloatManual(12.0)
>>> value
12.00
>>> print value
12.00
>>> RoundFloatManual(10)
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "<interactive input>", line 3, in __init__
AssertionError: value must be a float!
>>> 

13.13.2 数值定制(Time60)

>>> class Time60(object):
... 	def __init__(self, hr, min):
... 		self.hr = hr
... 		self.min = min
... 	def __str__(self):
... 		return '%d:%d'%(self.hr, self.min)
... 	def __add__(self, other):
... 		return self.__class__(self.hr + other.hr, self.min + other.min)
... 	def __iadd__(self, other):
... 		self.hr += other.hr
... 		self.min += other.min
... 		return self
... 	__repr__ = __str__
... 
>>> time = Time60(10, 20)
>>> time
10:20
>>> print time
10:20
>>> time + Time60(11,10)
21:30
>>> time += Time60(1,0)
>>> time
11:20
>>> 

像加号(+),我们只需要重载__add__()方法。__iadd__()是用来支持像mon+=tue 这样的操作符,并把正确的结果赋给mon。重载一个__i*__()方法的唯一秘密就是它必须返回self。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值