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 相关文章推荐
PyQt5主窗口动态加载Widget实例代码
Feb 07 Python
使用pandas中的DataFrame数据绘制柱状图的方法
Apr 10 Python
面向初学者的Python编辑器Mu
Oct 08 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
Nov 01 Python
Python + Flask 实现简单的验证码系统
Oct 01 Python
python做接口测试的必要性
Nov 20 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
python将unicode和str互相转化的实现
May 11 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 Python
python 将列表里的字典元素合并为一个字典实例
Sep 01 Python
python中random.randint和random.randrange的区别详解
Sep 20 Python
如何用PyPy让你的Python代码运行得更快
Dec 02 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介绍篇
2010/10/26 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
2015/12/21 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
jQuery 操作XML入门
2008/12/25 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
深入理解JavaScript内置函数
2016/06/03 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
nodejs中全局变量的实例解析
2017/03/07 NodeJs
微信小程序学习之数据处理详解
2017/07/05 Javascript
使用Angular CLI从蓝本生成代码详解
2018/03/24 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
2018/08/08 jQuery
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
微信小程序位置授权处理方法
2019/06/13 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
CSS3弹性布局内容对齐(justify-content)属性使用详解
2017/07/31 HTML / CSS
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
某同学的自我鉴定范文
2013/12/26 职场文书
十佳教师事迹材料
2014/01/11 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
业务员岗位职责范本
2015/04/03 职场文书
学校体育节班级口号
2015/12/25 职场文书
导游词之江西赣州
2019/10/15 职场文书
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang
mysql 带多个条件的查询方式
2021/06/05 MySQL
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL