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删除列表中重复记录的方法
Apr 28 Python
R语言 vs Python对比:数据分析哪家强?
Nov 17 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
Python DataFrame.groupby()聚合函数,分组级运算
Sep 18 Python
python圣诞树编写实例详解
Feb 13 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
Mar 17 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
Jul 07 Python
Python 如何实现访问者模式
Jul 28 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
Sep 23 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
Nov 06 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
Dec 21 Python
Python爬取某平台短视频的方法
Feb 08 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
老照片 - 几十年前的收音机与人
2021/03/02 无线电
一个用php实现的获取URL信息的类
2007/01/02 PHP
php对mongodb的扩展(初出茅庐)
2012/11/11 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
详解php中反射的应用
2016/03/15 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
读jQuery之三(构建选择器)
2011/06/11 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
js登录弹出层特效
2014/03/07 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
2017/01/23 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
详解Vue的七种传值方式
2021/02/08 Vue.js
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
[02:24]DOTA2痛苦女王 英雄基础教程
2013/11/26 DOTA
Python3离线安装Requests模块问题
2019/10/13 Python
pytorch实现线性拟合方式
2020/01/15 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
HTML5 Canvas+JS控制电脑或手机上的摄像头实例
2014/05/03 HTML / CSS
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
自我评价200字分享
2013/12/17 职场文书
合作投资意向书
2014/04/01 职场文书
企业委托书范本
2014/09/13 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
离婚被告答辩状
2015/05/22 职场文书
汽车销售员工作总结
2015/08/12 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
设置IIS Express并发数
2022/07/07 Servers