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读取html中指定元素生成excle文件示例
Apr 03 Python
Python读写txt文本文件的操作方法全解析
Jun 26 Python
恢复百度云盘本地误删的文件脚本(简单方法)
Oct 21 Python
Python 通过截图匹配原图中的位置(opencv)实例
Aug 27 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
python文件处理fileinput使用方法详解
Jan 02 Python
Django中F函数的使用示例代码详解
Jul 06 Python
python求解汉诺塔游戏
Jul 09 Python
如何用python免费看美剧
Aug 11 Python
详解python中的异常和文件读写
Jan 03 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 Python
Python socket如何解析HTTP请求内容
Feb 12 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
截获网站title标签之家内容的例子
2006/10/09 PHP
PHP提取中文首字母
2008/04/09 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
Dom在ajax技术中的作用说明
2010/10/25 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
jQuery晃动层特效实现方法
2015/03/09 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
纯JS前端实现分页代码
2016/06/21 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
关于Vue中$refs的探索浅析
2020/11/05 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
python实现简易通讯录修改版
2018/03/13 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
python3 logging日志封装实例
2020/04/08 Python
Python学习之os模块及用法
2020/06/03 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
CSS3教程:background-clip和background-origin
2008/10/17 HTML / CSS
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
名企HR怎样看待求职信
2014/02/23 职场文书
股东合作协议书范本
2014/04/14 职场文书
关工委先进个人事迹材料
2014/05/23 职场文书
关爱空巢老人感想
2015/08/11 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
CentOS7环境下MySQL8常用命令小结
2022/06/10 Servers