为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人2483693 2021-10-10 13:37:26
我有一个叫做 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 的原生索引切片功能一样。
查看完整描述

2 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

您需要覆盖该__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。


查看完整回答
反对 回复 2021-10-10
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

您需要实施__getitem__(self, key)并返回您的课程。

来自 Python 文档:

调用以实现对 self[key] 的评估。对于序列类型,接受的键应该是整数和切片对象。请注意,负索引的特殊解释(如果类希望模拟序列类型)取决于getitem () 方法。如果 key 的类型不合适,可能会引发 TypeError;如果序列的索引集之外的值(在对负值进行任何特殊解释之后),则应该引发 IndexError 。对于映射类型,如果缺少 key(不在容器中),则应引发 KeyError。

当您调用obj[0]它时,这是obj.__getitem__(0). 因此,只需覆盖__getitem__您的类以返回您的类的实例。


查看完整回答
反对 回复 2021-10-10
  • 2 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号