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

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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值