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
相关产品推荐
相关产品推荐

