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实现网页链接提取的方法分享
Feb 25 Python
理解python多线程(python多线程简明教程)
Jun 09 Python
python创建进程fork用法
Jun 04 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
python flask搭建web应用教程
Nov 19 Python
IronPython连接MySQL的方法步骤
Dec 27 Python
python 正则表达式参数替换实例详解
Jan 17 Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 Python
Python3爬虫中pyspider的安装步骤
Jul 29 Python
python中PyQuery库用法分享
Jan 15 Python
2021年值得向Python开发者推荐的VS Code扩展插件
Jan 25 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
May 28 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获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
基于PHP实现短信验证码接口(容联运通讯)
2016/09/06 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
javascript中&quot;/&quot;运算符常见错误
2010/10/13 Javascript
移动节点的jquery代码
2014/01/13 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
2018/07/18 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
微信小程序之onLaunch与onload异步问题详解
2019/03/28 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
js实现简单页面全屏
2019/09/17 Javascript
使用Vue实现一个树组件的示例
2020/11/06 Javascript
Python3实现连接SQLite数据库的方法
2014/08/23 Python
python使用Tkinter显示网络图片的方法
2015/04/24 Python
Python的time模块中的常用方法整理
2015/06/18 Python
20行python代码实现人脸识别
2019/05/05 Python
基于Python共轭梯度法与最速下降法之间的对比
2020/04/02 Python
python 如何引入协程和原理分析
2020/11/30 Python
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
服装发布会策划方案
2014/05/22 职场文书
园林系毕业生求职信
2014/06/23 职场文书
蔬果开业典礼发言稿应该怎么写?
2019/09/03 职场文书
总结Java对象被序列化的两种方法
2021/06/30 Java/Android
Oracle 死锁的检测查询及处理
2021/09/25 Oracle