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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章