python如何讓類支持比較運算
本文實例為大家分享了python類支持比較運算的具體代碼,供大家參考,具體內容如下
案例:
有時我們希望自定義的類,實例間可以使用比較運算符進行比較,我們自定義比較的行為。
需求:
有一個矩形的類,我們希望比較兩個矩形的實例時,比較的是他們的面積
如何解決這個問題?
在類中重新定義比較運算符,所有的比較運算可以簡化為兩個基本的比較運算,小于和等于比較
單個類比較
#!/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() 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)
會出現(xiàn)一個問題,重復代碼,如何解決?
通過functools下類的裝飾器total_ordering進行比較
# !/usr/bin/python3 from math import pi from abc import abstractmethod from functools import total_ordering @total_ordering class Shape(object): """ 定義一個抽象類,重定義比較運算,再定義抽象方法,然后子類通過這個方法進行比較, 其他子類比較類都需要重構抽象方法,實現(xiàn)比較運算 """ # 標記比較方法,抽象方法 @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)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Python?OpenCV超詳細講解圖像堆疊的實現(xiàn)
OpenCV用C++語言編寫,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要傾向于實時視覺應用,并在可用時利用MMX和SSE指令,本篇文章帶你通過OpenCV實現(xiàn)圖像堆疊2022-04-04移除Selenium中window.navigator.webdriver值
這篇文章主要為大家介紹了如何正確的移除Selenium中window.navigator.webdriver的值方法步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06Python+Dlib+Opencv實現(xiàn)人臉采集并表情判別功能的代碼
這篇文章主要介紹了Python+Dlib+Opencv實現(xiàn)人臉采集并表情判別,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07