You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python自定义类如何实现支持方括号调用的slice读写属性?

错误原因

你现有的代码报错,核心原因是@property装饰器生成的是property类型对象,该对象本身没有__getitem__属性,因此无法用@slice.__getitem__的方式绑定索引方法。另外你混淆了实现逻辑:你需要的是slice属性的返回值支持[]操作,而非让property对象本身支持[]操作。

实现方案

要实现类似pandas iloc的索引效果,核心思路是让slice属性返回一个代理对象,这个代理对象单独实现__getitem__(读)和__setitem__(写)方法,所有索引操作都直接转发给mylist属性处理。

完整实现代码如下:

class List:
    def __init__(self):
        self.mylist = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        # 初始化切片代理实例
        self._slice_proxy = self._SliceProxy(self)

    # 内部私有代理类,处理所有切片读写逻辑
    class _SliceProxy:
        def __init__(self, outer_instance):
            # 保存外层List类的实例引用
            self.outer = outer_instance

        def __getitem__(self, key):
            # 直接将索引/切片参数转发给mylist处理
            return self.outer.mylist[key]

        def __setitem__(self, key, value):
            # 赋值操作也直接转发给mylist处理
            self.outer.mylist[key] = value

    @property
    def slice(self):
        # 返回代理对象,后续[]操作都会走代理类的对应方法
        return self._slice_proxy

功能验证

用你给出的测试用例运行结果完全符合预期:

l = List()
print(l.slice[2:6]) # 输出 [3, 4, 5, 6]
print(l.slice[-1])  # 输出 9
l.slice[1] = 10
print(l.mylist[1])  # 输出 10
l.slice[-1] = 10
print(l.mylist[-1]) # 输出 10

内容的提问来源于stack exchange,提问作者Danilo Matrangolo Marano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:48:02