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 相关文章推荐
go和python调用其它程序并得到程序输出
Feb 10 Python
Python实现的数据结构与算法之快速排序详解
Apr 22 Python
Linux下用Python脚本监控目录变化代码分享
May 21 Python
web.py 十分钟创建简易博客实现代码
Apr 22 Python
Python3实现并发检验代理池地址的方法
Sep 18 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
Python简单计算给定某一年的某一天是星期几示例
Jun 27 Python
Python 存储字符串时节省空间的方法
Apr 23 Python
pyqt5之将textBrowser的内容写入txt文档的方法
Jun 21 Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 Python
Windows平台Python编程必会模块之pywin32介绍
Oct 01 Python
pytorch实现Tensor变量之间的转换
Feb 17 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
一个ubbcode的函数,速度很快.
2006/10/09 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
php实现留言板功能(代码详解)
2017/03/28 PHP
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
基于jQuery倒计时插件实现团购秒杀效果
2016/05/13 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
vue中的v-model原理,与组件自定义v-model详解
2020/08/04 Javascript
vue keep-alive的简单总结
2021/01/25 Vue.js
python正则表达式修复网站文章字体不统一的解决方法
2013/02/21 Python
python调用cmd复制文件代码分享
2013/12/27 Python
使用cx_freeze把python打包exe示例
2014/01/24 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
深入理解Python中的内置常量
2017/05/20 Python
django创建自定义模板处理器的实例详解
2017/08/14 Python
利用aardio给python编写图形界面
2017/08/21 Python
python编写暴力破解zip文档程序的实例讲解
2018/04/24 Python
python多线程分块读取文件
2019/08/29 Python
利用python实现AR教程
2019/11/20 Python
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
电子邮箱格式怎么写
2014/01/12 职场文书
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
毕业证明模板
2015/06/19 职场文书
springboot中的pom文件 project报错问题
2022/01/18 Java/Android