猿问

我从列表类型派生了一个类。但是我的类上的索引切片返回一个 Python 列表对象,而不是我自己的对象

我有一个叫做 AudioBuffer 的类,它派生自 Python 的列表类型。


在你问之前,是的,我确实将必要的参数传递给了父链。


def __init__(self, *args, **kwargs):

    super(AudioBuffer, self).__init__(*args, **kwargs)

一切都像一个魅力。我可以使用包括索引在内的所有列表功能。


问题是:当我对我的对象使用索引切片时,返回的对象是一个“列表”,而不是我的 AudioBuffer。


例子:


foo = AudioBuffer([15, 25, 35])

foo[1:].methodFromAudioBuffer()


AttributeError: 'list' object has no attribute 'methodFromAudioBuffer'

现在,AudioBuffer(foo[1:]).methodFromAudioBuffer想到了。但这会创建一个新的 AudioBuffer 实例。我不想要那样。我想要对原始对象的引用,因为我想修改它的一部分。就像 Python 的原生索引切片功能一样。


慕码人2483693
浏览 183回答 2
2回答

慕姐4208626

您需要覆盖该__getitem__方法:class AudioBuffer(list):    def __init__(self, *args, **kwargs):       super(AudioBuffer, self).__init__(*args, **kwargs)    def __getitem__(self, key):        return AudioBuffer(list.__getitem__(self, key))    def methodFromAudioBuffer(self):        print("my list is", self)>>> foo = AudioBuffer([15, 25, 35])>>> foo[1:].methodFromAudioBuffer()my list is [25, 35]在将序列子类化为子类时,也推荐使用collections.MutableSequence。

qq_遁去的一_1

您需要实施__getitem__(self, key)并返回您的课程。来自 Python 文档:调用以实现对 self[key] 的评估。对于序列类型,接受的键应该是整数和切片对象。请注意,负索引的特殊解释(如果类希望模拟序列类型)取决于getitem () 方法。如果 key 的类型不合适,可能会引发 TypeError;如果序列的索引集之外的值(在对负值进行任何特殊解释之后),则应该引发 IndexError 。对于映射类型,如果缺少 key(不在容器中),则应引发 KeyError。当您调用obj[0]它时,这是obj.__getitem__(0). 因此,只需覆盖__getitem__您的类以返回您的类的实例。
随时随地看视频慕课网APP

相关分类

Python
我要回答