您好,登錄后才能下訂單哦!
本文實例為大家分享了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 pi from abc import abstractmethod from functools import total_ordering @total_ordering class 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)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。