python 7-5 如何讓類支持比較操作
解決方案
第一種方案實現如下方案
比較符號運算符重載,要實現以下方法
lt
le
gt
ge
eq
ne
第二種方案
使用標準庫中的functools下的類裝飾器total_ordering可以簡化此過程,
實現lt eq 後,total_ordering可以推測出<= >=方法
def lt(self,rect):
return self.area() < rect.area()
def __eq__(self,rect):
return self.area() == rect.area()
爲了可以比較不同對象,我們可以將不同對象都繼承一個類,在類中給出一個抽象函數,讓需要參與的比較對象實現
解決方案1:
class Rectangle(object):
def __init__(self,w,h):
self.w = w
self.h = h
def area(self):
return self.w * self.h
def __lt__(self,rect):
if self.area() < rect.area():
return True
else:
return False
def __le__(self,rect):
if self.area() <= rect.area():
return True
else:
return False
def __gt__(self,rect):
if self.area() > rect.area():
return True
else:
return False
def __eq__(self,rect):
if self.area() == rect.area():
return True
else:
return False
def __ne__(self,rect):
if self.area() != rect.area():
return True
else:
return False
rect1 = Rectangle(1.0,2.0)
rect2 = Rectangle(1.0,1.0)
print rect1 < rect2
解決方案2:
from functools import total_ordering
@total_ordering
class Rectangle2(object):
def __init__(self,w,h):
self.w = w
self.h = h
def area(self):
return self.w * self.h
def __lt__(self,rect):
return self.area() < rect.area()
def __eq__(self,rect):
return self.area() == rect.area()
rect1 = Rectangle(1.0,2.0)
rect2 = Rectangle(1.0,1.0)
print rect1 >= rect2
from abc import ABCMeta,abstractmethod
class Shape(object):
@abstractmethod
def area(self):
pass
def __lt__(self,obj):
if not isinstance(obj,Shape):
return TypeError('obj is not Shape')
return self.area() < obj.area()
def __eq__(self,obj):
if not isinstance(obj,Shape):
return TypeError('obj is not Shape')
return self.area() == obj.area()
class Rentangle3(Shape):
def __init__(self,w,h):
self.w = w
self.h = h
def area(self):
return self.w * self.h
class Circle(Shape):
def __init__(self,r):
self.r = r
def area(self):
from math import pi
return self.r**2*pi
r1=Rentangle3(2,2)
c1=Circle(3)
print r1 > c1