Python 比较运算符

本文详细探讨了Python中对象比较的机制,特别是正向和反向调用的__eq__和__ne__方法,以及如何处理不同类型的对象比较。通过具体示例,展示了当比较涉及不同类型对象时,Python如何尝试调用反向方法来实现比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 中正向和反向使用的都是同一系列方法。例如,对 == 而言,正向和反向调用都是 __eq__ 方法,只是把参数对调了,而 >,<,>=,<=,正向的 __gt__ 方法调用的是反向的 __lt__ 方法,并把参数对调。对 == 和 != 来说,如果反向调用失败,Python 会比较对象的ID,而不是抛出 TypeError。

如下:

    def __eq__(self, other):
        if isinstance(other, Vector):  # <1>
            return (len(self) == len(other) and
                    all(a == b for a, b in zip(self, other)))
        else:
            return NotImplemented  # <2>
Tests of operator `==`::

    >>> va = Vector(range(1, 4))
    >>> vb = Vector([1.0, 2.0, 3.0])
    >>> va == vb
    True
    >>> vc = Vector([1, 2])
    >>> from vector2d_v3 import Vector2d
    >>> v2d = Vector2d(1, 2)
    >>> vc == v2d
    True
    >>> va == (1, 2, 3)
    False

第一个 va == vb 的比较是 True,正常。

第二个 是 Vector 实例和 Vector2d 实例比较,步骤如下:

1. 为了计算 vc == v2d,Python 调用 Vector.__eq__(vc,v2d)

2. 经 Vector.__eq__(vc,v2d)确认,v2d 不是 Vector 实例,因此返回 NotImplemented

3. Python 得到 NotImplemented 结果,尝试调用 Vector2d.__eq__(vc,v2d)

4. Vector2d.__eq__(v2d,vc) 把两个操作数都变成元组,然后比较,结果是 True

第三个,Vector 实例和元组比较时,步骤如下:

1. 为了计算 va == t3,Python调用 Vector.__eq__(va,t3)

2. 经 Vector.__eq__(va,t3) 确认,t3 不是 Vector 实例,因此返回 NotImplemented

3. Python 得到 NotImplemented 结果,尝试调用 tuple.__eq__(t3,va)

4. tuple.__eq__(t3,va) 不知道 Vector 是什么,因此返回 NotImplemented.

5. 对 == 来说,如果反向调用返回 NotImplemented,Python 会比较对象的ID。

!= 运算符,很简单,定义了 __eq__ 方法,而且它不返回 NotImplemented,__ne__ 会对__eq__返回的结果取反。

如下:

def __ne__(self,other):
   eq_result = self = other
   if eq_result is NotImplemented:
      return NotImplemented
   else:
      return not eq_result

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值