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

来源:互联网 发布:淘宝直播卖什么最好卖 编辑:程序博客网 时间:2024/05/22 02:14

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 Falserect1 = Rectangle(1.0,2.0)rect2 = Rectangle(1.0,1.0)print rect1 < rect2

解决方案2:

from functools import total_ordering@total_orderingclass 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 >= rect2from abc import ABCMeta,abstractmethodclass 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.hclass Circle(Shape):    def __init__(self,r):        self.r = r    def area(self):        from math import pi        return self.r**2*pir1=Rentangle3(2,2)c1=Circle(3)print r1 > c1
0 0