python如何让类支持比较运算


Posted in Python onMarch 20, 2018

本文实例为大家分享了python类支持比较运算的具体代码,供大家参考,具体内容如下

案例:

有时我们希望自定义的类,实例间可以使用比较运算符进行比较,我们自定义比较的行为。

需求:

有一个矩形的类,我们希望比较两个矩形的实例时,比较的是他们的面积

如何解决这个问题?

在类中重新定义比较运算符,所有的比较运算可以简化为两个基本的比较运算,小于和等于比较

单个类比较

#!/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检测远程端口是否打开的方法
Mar 14 Python
Python用threading实现多线程详解
Feb 03 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
python队列queue模块详解
Apr 27 Python
python生成n个元素的全组合方法
Nov 13 Python
对python中Json与object转化的方法详解
Dec 31 Python
Python中的异常处理try/except/finally/raise用法分析
Feb 28 Python
PyCharm导入python项目并配置虚拟环境的教程详解
Oct 13 Python
python中Lambda表达式详解
Nov 20 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 Python
python迷宫问题深度优先遍历实例
Jun 20 Python
Pygame Rect区域位置的使用(图文)
Nov 17 Python
python如何为创建大量实例节省内存
Mar 20 #Python
python如何对实例属性进行类型检查
Mar 20 #Python
python如何在循环引用中管理内存
Mar 20 #Python
Windows 7下Python Web环境搭建图文教程
Mar 20 #Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 #Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 #Python
Django开发中复选框用法示例
Mar 20 #Python
You might like
PHP 和 XML: 使用expat函数(一)
2006/10/09 PHP
mysql 字段类型说明
2007/04/27 PHP
PHP伪静态写法附代码
2008/06/20 PHP
PHP 图片水印类代码
2012/08/27 PHP
浅析PHP Socket技术
2013/08/02 PHP
php绘制圆形的方法
2015/01/24 PHP
PHP实现linux命令tail -f
2016/02/22 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
2017/05/15 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
JavaScript的setAttribute兼容性问题解决方法
2013/11/11 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
信息滚动效果的实例讲解
2017/09/18 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
Django权限机制实现代码详解
2018/02/05 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
Tensorflow训练模型越来越慢的2种解决方案
2020/02/07 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
学习十八届三中全会精神实施方案
2014/02/17 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年班组工作总结
2014/11/20 职场文书
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技