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 09 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
Python django实现简单的邮件系统发送邮件功能
Jul 14 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
pandas 空的dataframe 插入列名的示例
Oct 30 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
Django ManyToManyField 跨越中间表查询的方法
Dec 18 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
Jul 15 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 Python
Autopep8的使用(python自动编排工具)
Mar 02 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 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
点评山进PR-D3L三波段收音机
2021/03/02 无线电
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
2019/10/16 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
JavaScript中的高级函数
2018/01/04 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
Vue实现一个无限加载列表功能
2018/11/13 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
小试SVG之新手小白入门教程
2019/01/08 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
python实现神经网络感知器算法
2017/12/20 Python
分享vim python缩进等一些配置
2018/07/02 Python
Python2与Python3的区别实例分析
2019/04/11 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
印度在线杂货店:bigbasket
2018/08/23 全球购物
中药专业自荐信范文
2014/03/18 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
员工2014年度工作总结
2014/12/09 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
五一放假通知怎么写
2015/08/18 职场文书