Python的基本数据类型如整数、浮点数,能够进行数学运算。类可以吗?看下例:
>>> class RMB:
def __init__(self, sum = 0.0):
self.sum = sum
def __str__(self):
return str(self.sum)
>>> a = RMB()
>>> b = RMB()
>>> a + b
TypeError: unsupported operand types for
+: ’instance’ and ’instance’ #异常信息
我们定义了一个人民币类,然后生成两个实例,这两个实例相加之后,显 示了一条错误信息,表明实例不能进行相加操作。错误信息的意思是,加法操作暂时不支持两个实例操作数。
为了使类的实例也可以进行数学操作,我们需要在类的内部重新定 义数学操作符,使之支持用户定义的数据类型。有些朋友可能马上意识 到,这不是C++中的操作符重载吗?在这里我没有用“重载”这个词, 我认为C++中重载要比Python中的重载概念广泛得多,例如C++函数重 载,在Python中并不存在这个概念(也许我不知道)。因此,我用了重 定义一词。下面得例子中,修改了RMB类,添加了RMB类的加法和减法 操作,也就是RMB类的两个方法: add 和 sub 。
>>> class RMB:
def __init__(self, sum = 0.0):
self.sum = sum
def __str__(self):
return str(self.sum) def __add__(self, other): #重定义加法操作
return RMB(self.sum + other.sum)
def __sub__(self, other): #重定义减法操作
return RMB(self.sum - other.sum)
通常情况下,第一个参数是调用 add 或 sub 方法的对象。第二个参数 是other,以区别于第一个参数self。两个实例的相加或相减,也就是各自 属性sum的加减,所得的值作为新RMB实例的参数,因此返回值仍是人民币类。请看执行结果:
>>> a = RMB(20000)
>>> b = RMB(234.987)
>>> print a + b
20234.987
>>>print a - b
19765.013
其实表达式a + b和p1. add (p2)是等同的,我们可以试一试:
>>> a = RMB(34.5)
>>> b = RMB(345.98)
>>> print a.__add__(b), a + b
380.48 380.48
>>> print a.__sub__(b), a - b
-311.48 -311.48