了解__getitem__与__len__的互动

时间:2017-12-16 14:11:15

标签: python

我无法理解此代码中的内容:

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的内容的索引将返回01,{{ 1}},23,至少在我的理解中。我的问题是,为什么4会查找__getitem__.index

该功能打印出来:

__len__

2 个答案:

答案 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__())