我已覆盖内置类型__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
。符合预期。
如何重写单个方法以使自定义列表的表示形式一致?还是必须覆盖哪些方法才能涵盖检索自定义列表值的所有方法?
答案 0 :(得分:1)
如何重写单个方法以使自定义列表的表示形式一致?
通常出于效率原因,特定的实现通常不能保证单个方法可用于此类事情,尤其是内置方法。
如果您要确保所有内容都通过一个方法或已知的代码路径,而不是子类型,请创建一个 wrapper 序列(使用Sequence or MutableSequence),这样您就可以确切地知道实现了什么最终,您可以随时随地委托给包装的对象。