【问题标题】:Why do tuples in Python work with reversed but do not have __reversed__?为什么 Python 中的元组使用 reversed 但没有 __reversed__?
【发布时间】:2014-09-05 04:09:12
【问题描述】:

在讨论this answer 时,我们意识到元组没有__reversed__ 方法。我的猜测是创建迭代器需要改变元组。然而,元组与reversed 配合得很好。为什么不能使 reversed 使用的方法也适用于 __reversed__

>>> foo = range(3)
>>> foo
[0, 1, 2]
>>> list(foo.__reversed__())
[2, 1, 0]
>>> foo
[0, 1, 2]
>>> bar = (0, 1, 2)
>>> list(bar.__reversed__())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute '__reversed__'
>>> reversed(bar)
<reversed object at 0x10603b310>
>>> tuple(reversed(bar))
(2, 1, 0)

【问题讨论】:

    标签: python iterator tuples immutability reverse


    【解决方案1】:

    根据spec

    反转(序列)

    返回一个反向迭代器。 seq 必须是具有 反转() 方法或支持序列协议(__len__() 方法和 __getitem__() 方法,整数参数从 0).

    【讨论】:

    • 至关重要的是the section on __reversed__ 说,“支持序列协议的对象只有在能够提供比 reversed() 提供的实现更有效的实现时才应该提供 __reversed__()。”跨度>
    【解决方案2】:

    编辑:好吧,我试着再说一遍(英语不是我的母语)——举个例子。

    一些函数——我称之为fun(object)——可以使用object.__func__()来完成这项工作,或者如果没有object.__func__(),它们可以使用object中的其他函数

    -

    例如str() - 当您使用str(object) 时,它会调用object.__str__(),但如果没有object.__str__(),它会调用object.__repr__()

    因此,您可以将str() 与没有__str__() 的对象一起使用,仍然可以获得一些结果。

    -

    其他示例&lt; - 当您使用a &lt; b 时,它会尝试使用a.__lt__(),但如果没有a.__lt__(),它会尝试使用a.__gt__()(可能还有其他功能)

    class MyClass():
    
        def __str__(self):
            return "MyClass: __str__"
    
        def __repr__(self):
            return "MyClass: __repl__"
    
        #-------------------------
    
        def __lt__(self, other):
            return True
    
        def __gt__(self, other):
            return True
    
        #-------------------------
    
    a = MyClass()
    b = MyClass()
    
    print( str(a) )
    
    print( a < b )
    
    1. 您可以删除__str__ 以获得不同的结果。

    2. 你可以把True/False改成__lt__,可以看到结果变了。
      然后你可以删除__lt__,你可以把True/False改成__gt__,你会看到结果又变了。

    【讨论】:

    • 老实说,我不知道你在这里想说什么……想详细说明一下吗?
    猜你喜欢
    • 1970-01-01
    • 2020-08-16
    • 2013-06-01
    • 2015-08-16
    • 2016-09-20
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多