• 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

    请大家多多支持,点赞、评论和加关注!谢谢!

  • 相关阅读:
    Android测试AsyncTask下载图片
    Android DatePickerDialog TimepickerDialog
    Android AlertDialog
    Android activity的回传数据
    Android Handler简单使用
    Java Switch(String)
    JAVA测试装饰者模式
    Java实现数组按数值大小排序
    Java参数按值传递?按引用传递
    Spring cloud之断路器hystrix包问题
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/11166830.html
Copyright © 2020-2023  润新知