python如何讓類支援比較運算,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)
會出現一個問題,重複代碼,如何解決?
通過functools下類的裝飾器total_ordering進行比較
# !/usr/bin/python3 from math import pifrom abc import abstractmethodfrom functools import total_ordering @total_orderingclass Shape(object): """ 定義一個抽象類別,重定義比較運算,再定義抽象方法,然後子類通過這個方法進行比較, 其他子類比較類都需要重構抽象方法,實現比較運算 """ # 標記比較方法,抽象方法 @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)
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。