Python的富比较方法__eq__和__ne__之间的关联关系分析
Python的富比较方法包括__lt__、__gt__、__le__、__ge__、__eq__和__ne__
六个方法,分别表示:小于、大于、小于等于、大于等于、等于和不等于,对应的操作运算符为:<、>、<=、>=、==和!=
。那么是否象普通数字运算一样,这些符号之间存在关联关系呢?如“小于等于”是否就包含了“小于”?比较符号之间有必须的包含关系吗?本次对富比较方法__eq__和__ne__之间的关系进行分析:
Python建议__eq__和__ne__之间是非的关系,__ne__的方法实现时就应该调用__eq__取反来完成,但如果开发者不遵循该要求实际上也是可以的。
案例分析:
1、如果开发者Pyhon在自定义类中实现了__eq__和__ne__这两个方法,则“==”和“!=”的两个对象比较分别调用了这两个方法进行比较。代码如下:
>>> class Car():
def __init__(self,carname,oilcp100km, price):
self.carname,self.oilcp100km,self.price = carname,oilcp100km, price
def __eq__(self,other):
print("execute __eq__")
return self.price==other.price
def __ne__(self,other):
print("execute __ne__")
return self.price!=other.price
>>> car1,car2,car3,car4 = Car('爱丽舍',8,10),Car('凯美瑞',7,27),Car('爱丽舍',8,10),Car('途观',12,27)
>>> car1==car2
execute __eq__
False
>>> car1!=car2
execute __ne__
True
>>> car2==car4
execute __eq__
True
>>>
2、如果开发者Pyhon在自定义类中实现了__eq__方法,未实现__ne__方法,则“==”和“!=”都是__eq__方法,调用的两个对象比较都调用__eq__方法进行比较,不过后者是对__eq__取反。代码如下:
>>> class Car():
def __init__(self,carname,oilcp100km, price):
self.carname,self.oilcp100km,self.price = carname,oilcp100km, price
def __eq__(self,other):
print("execute __eq__")
return self.price==other.price
>>> car1,car2,car3,car4 = Car('爱丽舍',8,10),Car('凯美瑞',7,27),Car('爱丽舍',8,10),Car('途观',12,27)
>>> car1==car2
execute __eq__
False
>>> car1!=car2
execute __eq__
True
>>>
3、如果开发者Pyhon在自定义类中实现了__ne__方法,未实现__eq__方法,则“!=”调用__ne__方法,而eq则调用系统内置的“==”对应的方法,老猿初步分析应该是调用“is”,还没求证。代码如下:
>>> class Car():
def __init__(self,carname,oilcp100km, price):
self.carname,self.oilcp100km,self.price = carname,oilcp100km, price
def __ne__(self,other):
print("execute __ne__")
return self.price!=other.price
>>> car1,car2,car3,car4 = Car('爱丽舍',8,10),Car('凯美瑞',7,27),Car('爱丽舍',8,10),Car('途观',12,27)
>>> car1!=car3
execute __ne__
False
>>> car1==car3
False
>>> car1==car1
True
>>>
从上面3个分析过程可以知道,Python内部要求__eq__和__ne__是互反的关系,且在自定义类中未定义__ne__方法时,调用__eq__求反实现__ne__的判断,这是由于object类中__ne__方法就是这样实现的。
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!
相关文章
- python执行脚本加参数_命令行运行Python脚本时传入参数的三种方式详解以及argparse子命令subparsers()方法
- python property
- python中yield关键字方法详解
- 5 个Python 技巧一定不要错过
- 没有基础怎么学Python?
- 如何从零基础转行python数据分析
- 57 python - 异常
- 《Python数据挖掘:概念、方法与实践》一导读
- Elasticsearch 基本介绍及其与 Python 的对接实现
- Python导入bs4库报错的解决方法
- 【转载】 Python 方法参数 * 和 **
- 《Python面向对象编程指南》——2.7 __del__()方法
- 基于Python实现人脸识别【100010473】
- Python数据可视化 Pyecharts 制作 Sankey 桑基图
- 【Python】命令行参数的解析技巧
- 使用 PyWeb3D 的 3D 家具显示,用 Python 语法探索 three.js(教程含源码)
- python字符串find方法,python findall函数用法
- 小学生python游戏编程arcade----游戏界面按钮实现事件实现的三种方法
- 9.1 mongo_python.py
- Python:运行命令行的几种方式
- python 多种定时任务实现方法和举例,包括sleep、Timer、schedule、APScheduler等
- 【python】虚拟屏幕实现selenium截图的两种方法介绍
- python构建web界面实现MySQL数据库的操作
- [Python] split()方法