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__方法就是这样实现的。