事實上,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 可將課程添加到書簽
舉報