案例:
有時我們希望自定義的類,例項間可以使用比較運算子進行比較,我們自定義比較的行為。
需求:有乙個矩形的類,我們希望比較兩個矩形的例項時,比較的是他們的面積
如何解決這個問題?
在類中重新定義比較運算子,所有的比較運算可以簡化為兩個基本的比較運算,小於和等於比較
單個模擬較
#!/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):www.cppcns.com
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 abs程式設計客棧tractmethod
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, ymctl2)
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如何讓類支援比較運算
本文位址:
讓類支援比較操作
有時我們希望自定義類,例項間可以使用 號進行比較,我們自定義比較行為。例如,有乙個矩形類,我們希望比較兩個矩形的例項時,比較的是面積。class rectangle def init self,w,h self.w w self.h h defarea self return self.w self...
類支援比較操作
讓某個類的例項支援標準的比較運算 比如 等 但是又不想去實現那一大丟的特殊方法。python類對每個比較操作都需要實現乙個特殊方法來支援。例如為了支援 操作符,你需要定義乙個 ge 方法。儘管定義乙個方法沒什麼問題。裝飾器 functools.total ordering 就是用來簡化這個處理的。使...
python類與物件 如何讓物件支援上下文管理
問題舉例 乙個telnet客戶端的類telnetclient,呼叫例項的connect login interact方法 啟動客戶端與伺服器互動,互動完畢後需要呼叫cleanup 方法,關閉已連線的socket,以及將操作歷史記錄寫入檔案並關閉。能否讓telnetclient的例項支援上下文管理協議...