http://blog.sina.com.cn/s/blog_5357c0af01011392.html

我们经常需要比较两个对象,使用自定义的函数是个方法,但不直观

故而我们常常使用比较运算符来直接比较对象,此时我们需要对比较运算符进行自定义(重载)。

如果不重载,那么,对于自定义的对象将会比较对象的地址。

python中,我们可以通过对内建的比较函数进行自定义,来实现运算符重载。

我们常用的比较运算符有

大于 > 对应的内建比较函数为 __gt__()
大于等于 >= 对应的内建比较函数为 __ge__()

等于 == 对应的内建比较函数为 __eq__()

小于 < 对应的内建比较函数为 __lt__()
小于等于 <= 对应的内建比较函数为 __le__()

以下是个范例:

class p(object):
    def __init__(self,x,y):
        print 'init one p instance'
        self.x=x
        self.y=y
    def __cmp__(self,other):
        return 1
    def __eq__(self,other):
        return 'eq'
    def __lt__(self,other):
        return 'lt'
    def __gt__(self,other):
        return 'gt'
a=p(1,2)
b=p(3,4)
print 'a==b:',a==b
print 'a<b:',a<b
print 'a>b:',a>b
print cmp(a,b)

不过,其中有些需要说明的地方,按理说,我们使用对应的比较运算符就应该只调用对应的函数,但是,当我们只自定义了部分比较运算符时,实际上可能出现偏差:

当只定义了eq,使用=,只会调用相应eq,<= >= 不会调用eq
当只定义了lt,使用<,>都会调用lt,其他正常
当只定义了le,使用<=,>=都会调用le,其他正常
当只定义了gt,效果同lt,当只定义了ge,效果同le

如果如果同时定义了lt,gt,则使用<,>时各自调用,其他正常,同理适用 le,ge

为什么会这样?我不知道,但显然这让我们得到一个结论:相对的比较运算符必须对称存在,就是如果你自定义了lt你就必须自定义gt,如果自定义了le,就必须自定义ge,这就是答案!

还有一个特别的比较函数,他没有对应的运算符,这就是 __cmp__(),我们可以直接使用cmp(x,y)来使用此内置函数。此函数的作用是
如果 x<y 则 返回 -1
如果 x>y 则 返回 1
如果 x==y 则 返回0
那么,我们要问了,x,y是自定义对象时,如何比较呢?
如果我们没有自定义这个函数和其他比较函数的话,默认比较对象x,y的地址
如果我们自定义了比较函数的话,将返回0
如果我们自定义了__cmp__()比较函数的话,则得到函数返回值

但是对于

class tt(object):
def __init__(self,a,b):
self.a = a
self.b = b

这样的类,就不用自定义__cmp__函数,解析器自己会正确解析

python 内建比较函数详解相关推荐

  1. Python内置函数详解——总结篇

      引 言 国庆期间下定决心打算学习Python,于是下载安装了开发环境.然后问题就来了,怎么开始呢?纠结一番,还是从官方帮助文档开始吧.可是全是英文啊,英语渣怎么破?那就边翻译边看边实践着做吧(顺便 ...

  2. Python编程手册系列 - 日历、日期、时间相关内建模块详解

    Python - 日历calendar.日期datetime.时间time模块详解 博主精心制作了该系列彩色高亮的动态链接模块手册,预期该手册比阅读纸质书籍有更友好.更便捷.更让人舒适的使用体验.希望 ...

  3. Python基本语法_集合set/frozenset_内建方法详解

    目录 目录 前言 软件环境 可变集合Set set函数创建集合 创建空集合 集合元素的唯一性 集合推导式 set类型对象的内置方法 add增加一个元素 remove删除一个元素 pop随机删除并返回一 ...

  4. python内置函数详解总结篇_Python内置函数详解——总结篇

    数学运算(7个) 类型转换(24个) 序列操作(8个) 对象操作(7个) 反射操作(8个) 变量操作(2个) 交互操作(2个) 文件操作(1个) 编译执行(4个) 装饰器(3个) 数学运算 abs:求 ...

  5. python的装饰器迭代器与生成器_python3 装饰器、列表生成器、迭代器、内置方法详解等(第四周)...

    前言: 为什么要学习python3? 原因: 1.学习一门语言能力 2.通过该语言能力完成测试自动化以及独立完成自测框架知识 那么我要做什么呢? 1.每天花十个小时完成python3的学习 要在什么地 ...

  6. python列表的内置方法_Python内置方法详解

    1. 字符串内置方法详解 为何要有字符串?相对于元组.列表等,对于唯一类型的定义,字符串具有最简单的形式. 字符串往往以变量接收,变量名.可以查看所有的字符串的内置方法,如: 1> count: ...

  7. python 拼音库_python有没有拼音库python进阶之socket详解

    Socket的英文原义是"孔"或"插座".作为BSD UNIX的进程通信机制,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句 ...

  8. python列表拆包_详解python 拆包可迭代数据如tuple, list

    详解python 拆包可迭代数据如tuple, list 拆包是指将一个结构中的数据拆分为多个单独变量中. 以元组为例: >>> a = ('windows', 10, 25.1, ...

  9. python3 内置函数详解

    内置函数详解 abs(x) 返回数字的绝对值,参数可以是整数或浮点数,如果参数是复数,则返回其大小. # 如果参数是复数,则返回其大小.>>> abs(-25) 25>> ...

最新文章

  1. JavaScript:再谈Tasks和Microtasks
  2. 高通linux内核目录,高通 android 源代码以及目标系统目录结构
  3. 服务器自动关机怎么查,怎样设置WIN7系统的自动关机和查询系统上次的关机时间?...
  4. 给网站logo添加css帅气亮光扫过特效 附教程
  5. 《android基于andFix的热修复方案》思路篇
  6. 常见错误:JavaScript 提交form 的时候,Error:对象不支持此属性或方法
  7. 计算机基础教学模式,计算机基础行动导向教学模式的应用
  8. c语言 intptr_t
  9. 对数组名取地址a和 数组首地址a
  10. android 找不到密钥,InvalidKeyException:在Android设备上进行RSA解密时密钥库操作失败...
  11. 对JSON格式的城市按照拼音首字母排序
  12. 专网视频会议直播系统整合部署方案附拓扑图
  13. NPN和PNP型传感器或开关如何接线?
  14. 属于计算机网络硬件系统有哪些,下列不属于计算机硬件系统的是()
  15. 股票交易接口的分类webService接口
  16. 微信公众平台测试号推送思路
  17. 爬虫基础-----1.python基础
  18. filter和find的区别
  19. 分布式事务(6)-分布式事务处理技术之RocketMQ
  20. 调用http时因为js问题遇到的一个报错

热门文章

  1. kaggle机器学习 入门
  2. 深圳内推 | 腾讯优图实验室招聘计算机视觉算法工程师(校招/实习)
  3. 线性Attention的探索:Attention必须有个Softmax吗?
  4. Java Mail+Thymeleaf模板引擎实现发送HTML格式邮件
  5. 10丨 Redis主从同步与故障切换,有哪些坑
  6. Spring的事务控制-基于注解的方式
  7. jfinal框架批量导出数据到Excel
  8. JAVA——JUNIT运行错误[No tests were found]
  9. Java Web——JavaBean简介
  10. 模拟电梯1.0(类与对象实验)