python_如何让类支持比较运算?
2017-08-05 09:32
344 查看
案例:
有时我们希望自定义的类,实例间可以使用比较运算符进行比较,我们自定义比较的行为。
需求:
有一个矩形的类,我们希望比较两个矩形的实例时,比较的是他们的面积
如何解决这个问题?
在类中重新定义比较运算符,所有的比较运算可以简化为两个基本的比较运算,小于和等于比较
单个类比较
两个类比较
会出现一个问题,重复代码,如何解决?
通过functools下类的装饰器total_ordering进行比较
有时我们希望自定义的类,实例间可以使用比较运算符进行比较,我们自定义比较的行为。
需求:
有一个矩形的类,我们希望比较两个矩形的实例时,比较的是他们的面积
如何解决这个问题?
在类中重新定义比较运算符,所有的比较运算可以简化为两个基本的比较运算,小于和等于比较
单个类比较
#!/usr/bin/python3 from math import pi class Circle(object): def __init__(self, radius): self.radius = radius def get_area(self): return round(pow(self.radius, 2) * pi, 2) # 重定义小于比较 def __lt__(self, other): return self.get_area() < other.get_area() # 重定义等于比较 def __eq__(self, other): return self.get_area() == other.get_area() if __name__ == '__main__': c1 = Circle(3.0) c2 = Circle(5.0) print(c1 < c2) # c1.__le__(c2) print(c1 == c2) # c1.__eq__(c2)
两个类比较
#!/usr/bin/python3 from math import pi class Circle(object): def __init__(self, radius): self.radius = radius def get_area(self): return round(pow(self.radius, 2) * pi, 2) # 重定义小于比较 def __lt__(self, other): return self.get_area() < other.get_area() # 重定义等于比较 def __eq__(self, other): return self.get_area() == other.get_area() if __name__ == '__main__': c1 = Circle(3.0) c2 = Circle(5.0) print(c1 < c2) # c1.__le__(c2) print(c1 == c2) # c1.__eq__(c2)
# !/usr/bin/python3
from math import pi
class Circle(object):
def __init__(self, radius):
self.radius = radius
def get_area(self):
return round(pow(self.radius, 2) * pi, 2)
# 重定义小于比较
def __lt__(self, other):
return self.get_area() < other.get_area()
# 重定义等于比较
def __eq__(self, other):
return self.get_area() == other.get_area()
class Rectangle(object):
def __init__(self, width, height):
self.width = width
self.height = height
def get_area(self):
return self.width * self.height
# 重定义小于比较
def __lt__(self, other):
return self.get_area() < other.get_area()
# 重定义等于比较
def __eq__(self, other):
return self.get_area() == other.get_area()
if __name__ == '__main__':
c1 = Circle(5.0)
R1 = Rectangle(4.0, 5.0)
print(c1 > R1) # c1.__le__(c2)
print(c1 == R1) # c1.__eq__(c2)
会出现一个问题,重复代码,如何解决?
通过functools下类的装饰器total_ordering进行比较
# !/usr/bin/python3 from math import pi from abc import abstractmethod from functools import total_ordering @total_ordering class Shape(object): """ 定义一个抽象类,重定义比较运算,再定义抽象方法,然后子类通过这个方法进行比较, 其他子类比较类都需要重构抽象方法,实现比较运算 """ # 标记比较方法,抽象方法 @abstractmethod def get_area(self): pass # 重定义小于比较 def __lt__(self, other): return self.get_area() < other.get_area() # 重定义等于比较 def __eq__(self, other): return self.get_area() == other.get_area() class Circle(Shape): def __init__(self, radius): self.radius = radius def get_area(self): return round(pow(self.radius, 2) * pi, 2) class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def get_area(self): return self.width * self.height if __name__ == '__main__': c1 = Circle(5.0) R1 = Rectangle(4.0, 5.0) print(c1 > R1) # c1.__le__(c2) print(c1 == R1) # c1.__eq__(c2)
相关文章推荐
- python如何让类支持比较运算
- python 7-5 如何让类支持比较操作lt/le/total_ordering可以简化此过程,实现lt eq 后,可以推测出<= >=方法
- Python: Pandas运算的效率探讨以及如何选择高效的运算方式
- 如何让Ultraedit支持python语法高亮
- 如何让Python线程支持excepthook
- 如何编译OpenCV-2.3.x/OpenCV-2.4.x使其支持GPU-CUDA高速运算?
- Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
- Python(1):python代码中支持支持中文字符,读取xml文件,及比较文字字符串问题
- 如何在python中比较微秒时间差(microsecond)
- python3简单实现支持括号的加减乘除运算
- 练习python写了一个四则运算程序,支持乘方和“.3"这种格式
- 【转载】Python中如何高效实现两个字典合并,三种方法比较。
- 时序数据库如何支持秒级上亿数据的查询分组和聚合运算
- MongoDB windows 安装以及如何配置python的支持
- 如何使Python支持中文注释
- python中的堆支持自定义的比较函数 - Heap in Python with comparator.
- Python中比较特别的除法运算和幂运算介绍
- Python3和Django如何支持MySQL和MariaDB数据库
- 使用 Python 和 Oracle 数据库实现高并发性 了解如何借助线程和并发性提升支持 Oracle 数据库的 Python 应用程序的吞吐量和响应性。
- Python中定制类的比较运算方法