在讨论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)
答案 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 )
您可以删除__str__
以获得不同的结果。
您可以在True/False
中更改__lt__
,您可以看到结果已更改。
然后,您可以删除__lt__
,然后可以更改True/False
中的__gt__
,然后您会看到结果再次更改。