有時我們希望自定義類,例項間可以使用<,<=,>,>=,==,!=號進行比較,我們自定義比較行為。
例如,有乙個矩形類,我們希望比較兩個矩形的例項時,比較的是面積。
classrectangle:
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 importtotal_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...