您好,登錄后才能下訂單哦!
本文實(shí)例為大家分享了python類支持比較運(yùn)算的具體代碼,供大家參考,具體內(nèi)容如下
案例:
有時(shí)我們希望自定義的類,實(shí)例間可以使用比較運(yùn)算符進(jìn)行比較,我們自定義比較的行為。
需求:
有一個(gè)矩形的類,我們希望比較兩個(gè)矩形的實(shí)例時(shí),比較的是他們的面積
如何解決這個(gè)問(wèn)題?
在類中重新定義比較運(yùn)算符,所有的比較運(yùn)算可以簡(jiǎn)化為兩個(gè)基本的比較運(yùn)算,小于和等于比較
單個(gè)類比較
#!/usr/bin/python3 from math import pi class Circle(object): def __init__(self, radius): self.radius = radius def get_area(self): return round(pow(self.radius, 2) * pi, 2) # 重定義小于比較 def __lt__(self, other): return self.get_area() < other.get_area() # 重定義等于比較 def __eq__(self, other): return self.get_area() == other.get_area() if __name__ == '__main__': c1 = Circle(3.0) c2 = Circle(5.0) print(c1 < c2) # c1.__le__(c2) print(c1 == c2) # c1.__eq__(c2)
兩個(gè)類比較
#!/usr/bin/python3 from math import pi class Circle(object): def __init__(self, radius): self.radius = radius def get_area(self): return round(pow(self.radius, 2) * pi, 2) # 重定義小于比較 def __lt__(self, other): return self.get_area() < other.get_area() # 重定義等于比較 def __eq__(self, other): return self.get_area() == other.get_area() if __name__ == '__main__': c1 = Circle(3.0) c2 = Circle(5.0) print(c1 < c2) # c1.__le__(c2) print(c1 == c2) # c1.__eq__(c2) # !/usr/bin/python3 from math import pi class Circle(object): def __init__(self, radius): self.radius = radius def get_area(self): return round(pow(self.radius, 2) * pi, 2) # 重定義小于比較 def __lt__(self, other): return self.get_area() < other.get_area() # 重定義等于比較 def __eq__(self, other): return self.get_area() == other.get_area() class Rectangle(object): def __init__(self, width, height): self.width = width self.height = height def get_area(self): return self.width * self.height # 重定義小于比較 def __lt__(self, other): return self.get_area() < other.get_area() # 重定義等于比較 def __eq__(self, other): return self.get_area() == other.get_area() if __name__ == '__main__': c1 = Circle(5.0) R1 = Rectangle(4.0, 5.0) print(c1 > R1) # c1.__le__(c2) print(c1 == R1) # c1.__eq__(c2)
會(huì)出現(xiàn)一個(gè)問(wèn)題,重復(fù)代碼,如何解決?
通過(guò)functools下類的裝飾器total_ordering進(jìn)行比較
# !/usr/bin/python3 from math import pi from abc import abstractmethod from functools import total_ordering @total_ordering class Shape(object): """ 定義一個(gè)抽象類,重定義比較運(yùn)算,再定義抽象方法,然后子類通過(guò)這個(gè)方法進(jìn)行比較, 其他子類比較類都需要重構(gòu)抽象方法,實(shí)現(xiàn)比較運(yùn)算 """ # 標(biāo)記比較方法,抽象方法 @abstractmethod def get_area(self): pass # 重定義小于比較 def __lt__(self, other): return self.get_area() < other.get_area() # 重定義等于比較 def __eq__(self, other): return self.get_area() == other.get_area() class Circle(Shape): def __init__(self, radius): self.radius = radius def get_area(self): return round(pow(self.radius, 2) * pi, 2) class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def get_area(self): return self.width * self.height if __name__ == '__main__': c1 = Circle(5.0) R1 = Rectangle(4.0, 5.0) print(c1 > R1) # c1.__le__(c2) print(c1 == R1) # c1.__eq__(c2)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。