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脚本生成Android SALT扰码的方法
Sep 18 Python
Python中的exec、eval使用实例
Sep 23 Python
Go语言基于Socket编写服务器端与客户端通信的实例
Feb 19 Python
用yum安装MySQLdb模块的步骤方法
Dec 15 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
对numpy和pandas中数组的合并和拆分详解
Apr 11 Python
在CMD命令行中运行python脚本的方法
May 12 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
Mar 11 Python
Python 列表中的修改、添加和删除元素的实现
Jun 11 Python
Python3压缩和解压缩实现代码
Mar 01 Python
Python采集爬取京东商品信息和评论并存入MySQL
Apr 12 Python
python内置模块之上下文管理contextlib
Jun 14 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递归获取目录内所有文件的实现方法
2016/11/01 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
2015/12/11 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
JavaScript实现串行请求的示例代码
2020/09/14 Javascript
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python中获取对象信息的方法
2015/04/27 Python
Python实现二叉搜索树
2016/02/03 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
2020/05/27 Python
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
美国宠物护理专家:Revival Animal Health
2020/01/05 全球购物
材料化学应届生求职信
2013/10/09 职场文书
求职信模版
2013/11/30 职场文书
个人委托书范本汇总
2014/10/01 职场文书
大学生毕业评语
2014/12/31 职场文书
被告代理词范文
2015/05/25 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
室外天线与收音机天线杆接合方法
2022/04/05 无线电
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL
Python中的 enumerate和zip详情
2022/05/30 Python