我无法理解此代码中的内容:
normal_list = [1, 2, 3, 4, 5]
class CustomSequence():
def __len__(self):
return 5
def __getitem__(self, index):
return "x{0}".format(index)
class FunkyBackwards():
def __reversed__(self):
return "BACKWARDS!"
for seq in normal_list, CustomSequence(), FunkyBackwards():
print("\n{}: ".format(seq.__class__.__name__), end="")
for item in reversed(seq):
print(item, end=", ")
我知道自定义__len__
会使所有类型为CustomeSequence的对象返回长度为5,长度为5的内容的索引将返回0
,1
,{{ 1}},2
,3
,至少在我的理解中。我的问题是,为什么4
会查找__getitem__.index
?
该功能打印出来:
__len__
答案 0 :(得分:1)
不,__getitem__
没有"寻找" len
。它只是为了反转序列,你必须知道它的最后一项,为此你需要序列的长度,或__reversed__
魔法。
所以,Python的reversed
首先找到序列的长度并从最后一个序列开始检索它的元素:
def python_reverse(data):
for x in range(data.__len__() - 1, -1, -1):
yield data.__getitem__(x)
(明确地调用魔术方法不是Pythonic。这些调用只是为了显示它们的用法。在实际代码中,请使用len
和索引符号data[x]
代替。) / p>
答案 1 :(得分:1)
直接来自the docs:
如果未提供
__reversed__()
方法,reversed()
内置将回退到使用序列协议(__len__()
和__getitem__())
。