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使用paramiko实现远程拷贝文件的方法
Apr 18 Python
Google开源的Python格式化工具YAPF的安装和使用教程
May 31 Python
wxpython实现图书管理系统
Mar 12 Python
在VS Code上搭建Python开发环境的方法
Apr 06 Python
selenium + python 获取table数据的示例讲解
Oct 13 Python
PyQt4实时显示文本内容GUI的示例
Jun 14 Python
python中dict使用方法详解
Jul 17 Python
django-初始配置(纯手写)详解
Jul 30 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
python redis存入字典序列化存储教程
Jul 16 Python
使用gunicorn部署django项目的问题
Dec 30 Python
5道关于python基础 while循环练习题
Nov 27 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公用函数列表[正则]
2007/02/22 PHP
PHP 上传文件大小限制
2009/07/05 PHP
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
jQuery Plupload上传插件的使用
2017/04/19 jQuery
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
Vue SPA 首屏优化方案
2021/02/26 Vue.js
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
什么是封装
2013/03/26 面试题
就业自荐书
2013/12/05 职场文书
公司成立感言
2014/01/11 职场文书
答谢会策划方案
2014/05/12 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
六年级数学教学反思
2016/02/16 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
源码分析Redis中 set 和 sorted set 的使用方法
2022/03/22 Redis
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server