python富比较

Python富比较

富比较,即Rich Comparisons,创立于python2.1时期,使用富比较取代了__cmp__返回值(0,-1,1)的传统比较方式(后者在python3.4已被废除)。

富比较的主要方式有__eq__ __ne__ __gt__ __lt__ __ge__ __le__6种比较

其主要用于复杂对象之间的比较

下面分析其主要用法和注意事项:

  • 当程序员定义了所有的比较方式,此时对象之间的比较就会一一对应到其定义的方法

  • 当同时实现__eq__方法和__ne__方法时,此时使用!=和==会调用各自的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class Apple:

    def __init__(self, color, price):
    self.color = color
    self.price = 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

    ap1 = Apple('red', 10)
    ap2 = Apple('green', 10)
    print(ap1==ap2)
    print(ap1!=ap2)

    execute __eq__
    True
    execute __ne__
    False
  • 当实现__eq__方法,未实现__ne__方法,此时使用!=相当于执行__eq__后再取反

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Apple:

    def __init__(self, color, price):
    self.color = color
    self.price = price

    def __eq__(self, other):
    print('execute __eq__')
    return self.price == other.price

    ap1 = Apple('red', 10)
    ap2 = Apple('green', 10)
    print(ap1==ap2)
    print(ap1!=ap2)

    execute __eq__
    True
    execute __eq__
    False
  • 当实现__ne__方法,未实现__eq__方法,此时使用==相当于使用is

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Apple:

    def __init__(self, color, price):
    self.color = color
    self.price = price

    def __ne__(self, other):
    print('execute __ne__')
    return self.price != other.price

    ap1 = Apple('red', 10)
    ap2 = Apple('green', 10)
    print(ap1==ap2)
    print(ap1!=ap2)

    False
    execute __ne__
    False
  • 当单独实现__gt__(或__lt__),此时使用<(或>)相当于执行__gt__(或__lt__)再取反
-------------end-------------
0%