您的位置:首页 > 编程语言 > Python开发

python 7-5 如何让类支持比较操作lt/le/total_ordering可以简化此过程,实现lt eq 后,可以推测出<= >=方法

2017-01-28 16:35 951 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐