为什么Python中的元组可以反转但没有__reversed__?

时间:2014-07-15 05:02:02

标签: python iterator tuples immutability reverse

在讨论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)

2 个答案:

答案 0 :(得分:9)

根据spec

<强>反转(SEQ)

  

返回反向迭代器。 seq必须是一个具有的对象   颠倒()方法或支持序列协议(__len __()方法和__getitem __()方法,其中包含整数参数   0)。

答案 1 :(得分:-2)

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

某些功能 - 我称之为fun(object) - 可以使用object.__func__()来完成工作,或者如果没有object

,他们会使用object.__func__()中的其他功能

-

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

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

-

其他示例< - 当您使用a < 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__,然后您会看到结果再次更改。