python如何讓類支援比較運算

2022-10-04 20:09:18 字數 3569 閱讀 4398

案例:

有時我們希望自定義的類,例項間可以使用比較運算子進行比較,我們自定義比較的行為。

需求:有乙個矩形的類,我們希望比較兩個矩形的例項時,比較的是他們的面積

如何解決這個問題?

在類中重新定義比較運算子,所有的比較運算可以簡化為兩個基本的比較運算,小於和等於比較

單個模擬較

#!/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的例項支援上下文管理協議...