为什么list .__ repr__不使用list .__ getitem __?

时间:2019-04-30 06:17:38

标签: python python-3.x list

我已覆盖内置类型__getitem__的{​​{1}}:

list

并创建了一个新实例:

class my_list(list):
    def __getitem__(self, index, *args, **kwargs):
        value = super().__getitem__(index, *args, **kwargs)
        if isinstance(index, slice): 
            return [v**2 for v in value]
        return value**2

a = my_list((1, 2, 3, 4)) repr(a)都输出相同的未修改的print(a)值,而不调用覆盖的[1, 2, 3, 4]。在这两种情况下,我都希望得到__getitem__

但是,[1, 4, 9, 16]a[2]调用a[:],结果分别为__getitem__9。符合预期。

如何重写单个方法以使自定义列表的表示形式一致?还是必须覆盖哪些方法才能涵盖检索自定义列表值的所有方法?

1 个答案:

答案 0 :(得分:1)

  

如何重写单个方法以使自定义列表的表示形式一致?

通常出于效率原因,特定的实现通常不能保证单个方法可用于此类事情,尤其是内置方法。

如果您要确保所有内容都通过一个方法或已知的代码路径,而不是子类型,请创建一个 wrapper 序列(使用Sequence or MutableSequence),这样您就可以确切地知道实现了什么最终,您可以随时随地委托给包装的对象。