【问题标题】:Relationship between the __eq__ attribute and the equality operator?__eq__ 属性和相等运算符之间的关系?
【发布时间】:2014-10-21 03:56:47
【问题描述】:

因此,以下内置类具有__eq__ 属性,(我假设)这就是您可以测试它们的实例是否相等的原因:

>>> 1.2.__eq__( 1.2 )
True
>>> 1.2 == 1.2
True
>>> 'hello'.__eq__( 'hi' )
False
>>> 'hello' == 'hi'  
False
>>> [1,2].__eq__( [1,2] )
True
>>> [1,2] == [1,2]  
True

然后我惊讶地发现int 对象没有__eq__,但我们仍然可以比较它们:

>>> hasattr( 1, '__eq__' )
False
>>> 1 == 2 
False

发生了什么事?是不是我误解了__eq__和等号运算符的关系?

【问题讨论】:

    标签: python python-2.7 operators equality


    【解决方案1】:

    int 对象有一个 __cmp__ method 代替:

    如果没有定义丰富的比较(见上文),则由比较操作调用。

    其中丰富的比较包括__eq__

    演示:

    >>> (1).__cmp__(2)
    -1
    >>> (1).__cmp__(1)
    0
    >>> (1).__cmp__(0)
    1
    

    __cmp__ 返回0 时,这两个值相等。

    Python 3 取消了cmp() 比较和相关的特殊方法;在 Python 3 中 int 确实 有一个 __eq__ 方法:

    >>> import sys
    >>> sys.version_info
    sys.version_info(major=3, minor=4, micro=0, releaselevel='final', serial=0)
    >>> (1).__eq__(1)
    True
    

    此外,Python 3 int 对象也提供了其他 rich comparison methods__lt____le____ne____gt____ge__,Python 2 版本中缺少所有方法。

    Python 从 just __cmp__ 开始,仅在 Python 2.1 中添加了丰富的比较支持(请参阅 PEP 207),直到 Python 3 才转换整数。保留两个比较系统,因此放弃了表达较少的形式。

    【讨论】:

    • 在 Python 3 中 int 确实有一个 __cmp__ 方法: - 我认为你的意思是确实有一个 __eq__ 方法跨度>
    猜你喜欢
    • 2017-10-26
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多