事实上,Python很多的操作都是通过内建函数来实现的,比如最熟悉的加减乘除,都是通过内建函数来实现的,分别是__add__
、__sub__
、__mul__
、__truediv__
。因此,只要我们的自定义类实现了相关的内建函数,我们的类对象,也可以做到加减乘除。
对于有理数,我们可以使用Rational类来表示:
class Rational(object): def __init__(self, p, q): self.p = p self.q = q
其中,p、q 都是整数,表示有理数 p/q。
如果要让Rational进行加法运算,需要正确实现__add__:
class Rational(object): def __init__(self, p, q): self.p = p self.q = q def __add__(self, r): return Rational(self.p * r.q + self.q * r.p, self.q * r.q) def __str__(self): return '{}/{}'.format(self.p, self.q)
定义好后,就可以尝试一下有理数的加法了:
>>> r1 = Rational(1, 2) >>> r2 = Rational(2, 3) >>> print(r1 + r2) 7/6
需要注意__add__()函数,它有一个参数,表示的是运算的第二个操作数,比如:r1 + r2,那么在__add__()方法中的参数,r指的就是r2,这个参数是运算符重载的时候传递的。
另外,细心的同学可能注意到了,相比加减乘的特殊方法,除法的特殊方法名字较长__truediv__,并且含有true这样的描述,这其实和Python除法是有关系的。
Python的除法可以分为地板除(你没看错,就是地板)和普通除法,地板除的特殊方法是__floordiv__,普通除法是__truediv__。
地板除法和普通除法不一样,地板除法的结果只会向下取整数。
>>> num = 5 >>> num.__truediv__(3) 1.6666666666666667 >>> num.__floordiv__(3) 1 # 向下取整 >>> num = 7 >>> num.__floordiv__(3) 2
在运算中,普通除法使用/表示,而地板除使用//表示。
>>> 5 / 3 1.6666666666666667 >>> 5 // 3 1
Rational类虽然可以做加法,但无法做减法、乘法和除法,请继续完善Rational类,实现四则运算。
请在本地编写代码练习
参考答案:
def gcd(a, b): if b == 0: return a return gcd(b, a % b) class Rational(object): def __init__(self, p, q): self.p = p self.q = q def __add__(self, r): return Rational(self.p * r.q + self.q * r.p, self.q * r.q) def __sub__(self, r): return Rational(self.p * r.q - self.q * r.p, self.q * r.q) def __mul__(self, r): return Rational(self.p * r.p, self.q * r.q) def __truediv__(self, r): return Rational(self.p * r.q, self.q * r.p) def __str__(self): g = gcd(self.p, self.q) return '{}/{}'.format(int(self.p/g), int(self.q/g)) r1 = Rational(1, 2) r2 = Rational(1, 5) print(r1 + r2) print(r1 - r2) print(r1 * r2) print(r1 / r2)
请验证,完成请求
由于请求次数过多,请先验证,完成再次请求
打开微信扫码自动绑定
绑定后可得到
使用 Ctrl+D 可将课程添加到书签
举报