讓類支援比較操作

2022-08-15 03:36:15 字數 2456 閱讀 1017

有時我們希望自定義類,例項間可以使用<,<=,>,>=,==,!=號進行比較,我們自定義比較行為。

例如,有乙個矩形類,我們希望比較兩個矩形的例項時,比較的是面積。

class

rectangle:

def__init__

(self,w,h):

self.w=w

self.h=h

defarea(self):

return self.w*self.h

rect1 = rectangle(5,3)

rect2 = rectangle(4,4)

rect1 > rect2 #

=> rect1.area() > rect2.area()

比較運算子方法的過載,需要實現以下方法:

__lt__,__le__,__gt__,__ge__,__eq__,__ne__

使用標準庫下的functools下的類裝飾器total_ordering可以簡化此過程

利用total_ordering裝飾器可不必全部過載以上類似__lt__的方法,而是__lt__ & __eq__兩個即可,

total_ordering會根據這兩個方法推算出其他方法。

本例還將類抽象了出來,任何兩個相比較的類都繼承shape類,shape類提供乙個抽象方法即area,

通過各種形狀的面積來比較各物件的大小,在shape類中只過載了__lt__ & __eq__,並用了裝飾器total_ordering

from functools import

total_ordering

from abc import

abcmeta, abstractmethod

@total_ordering

class

shape(object):

"""docstring for shape

"""@abstractmethod

defarea(self):

pass

def__lt__

(self, obj):

ifnot

isinstance(obj, shape):

raise typeerror("

it's not shape")

return self.area() def__eq__

(self, obj):

ifnot

isinstance(obj, shape):

raise typeerror("

it's not shape")

return self.area() ==obj.area()

class

rectanglecompare(shape):

"""docstring for rectanglecompare

"""def

__init__

(self, w, h):

self.w =w

self.h =h

defarea(self):

return self.w *self.h

class

circle(shape):

"""docstring for circle

"""def

__init__

(self, r):

self.r =r

defarea(self):

return self.r ** 2 * 3.14rc1 = rectanglecompare(2,9)

rc2 = rectanglecompare(3,4)

c1 = circle(2)

c2 = circle(3)

print rc1>=rc2

print c1.r,'

',c1.area()

print rc1.area(),'

',c2.area()

print rc1>c2

print rc2==1執行結果:

truetraceback (most recent call last):

file

"d:\python space\classcompare.py

", line 49, in

true

2 12.56

18 28.26false

print rc2==1file

"d:\python space\classcompare.py

", line 18, in

__eq__

raise typeerror("

it's not shape")

typeerror: it

's not shape

類支援比較操作

讓某個類的例項支援標準的比較運算 比如 等 但是又不想去實現那一大丟的特殊方法。python類對每個比較操作都需要實現乙個特殊方法來支援。例如為了支援 操作符,你需要定義乙個 ge 方法。儘管定義乙個方法沒什麼問題。裝飾器 functools.total ordering 就是用來簡化這個處理的。使...

python如何讓類支援比較運算

案例 有時我們希望自定義的類,例項間可以使用比較運算子進行比較,我們自定義比較的行為。需求 有乙個矩形的類,我們希望比較兩個矩形的例項時,比較的是他們的面積 如何解決這個問題?在類中重新定義比較運算子,所有的比較運算可以簡化為兩個基本的比較運算,小於和等於比較 單個模擬較 usr bin pytho...

讓mysql支援事務操作

1.檢視資料庫儲存引擎 輸入sql命令 show engines 如果innodb是disabled缺失 如果innodb是yes 啟用的 如果innodb是 no停用的 如果innodb是default預設引擎 2.啟用innodb並設定為預設引擎 找到資料庫服務配置檔案mysql.ini 找到d...