Python 通过订阅或实现视图使类可变

Python 通过订阅或实现视图使类可变,python,list,numpy,class,Python,List,Numpy,Class,考虑以下Python类定义: class Custom: def __init__(self, items): self.items = items def __getitem__(self, key): return Custom(items[key]) 作为一个示例,我希望实现以下代码片段,以打印“true”,而不是“false”: 也就是说,我希望能够以一种方式为我的类(基本上只包含列表)下标,使\uuu getitem\

考虑以下Python类定义:

class Custom:
    def __init__(self, items):
        self.items = items
        
    def __getitem__(self, key):
        return Custom(items[key])
作为一个示例,我希望实现以下代码片段,以打印
“true”
,而不是
“false”

也就是说,我希望能够以一种方式为我的类(基本上只包含列表)下标,使
\uuu getitem\uuu()
返回实例的“视图”,即视图列表的更改传播到原始实例的列表

我希望我的类的行为与其保存的列表完全相同,例如,
numpy
数组的行为与其保存的值相同。下面打印的是
“true”

我怎样才能做到这一点?谢谢

当我们写作时

view[0] = 0
我们没有调用
\uuuu getitem\uuuu
。我们正在呼叫
\uuuu setitem\uuuu
。这条线大致相当于

view.__setitem__(0, 0)
所以你需要实现这个方法

class Custom:
    def __init__(self, items):
        self.items = items
    
    def __getitem__(self, key):
        return Custom(self.items[key])

    def __setitem__(self, key, value):
        self.items[key] = value
        # ... or whatever wrapping/unwrapping you want to do with the value
当我们写作时

view[0] = 0
我们没有调用
\uuuu getitem\uuuu
。我们正在呼叫
\uuuu setitem\uuuu
。这条线大致相当于

view.__setitem__(0, 0)
所以你需要实现这个方法

class Custom:
    def __init__(self, items):
        self.items = items
    
    def __getitem__(self, key):
        return Custom(self.items[key])

    def __setitem__(self, key, value):
        self.items[key] = value
        # ... or whatever wrapping/unwrapping you want to do with the value

借用这个答案:

import collections.abc
类ListSlice(collections.abc.Sequence):
定义初始值(self、alist、start、alen):
自我主义者
self.start=开始
self.alen=alen
定义(自我):
返回self.alen
定义调整(自我,我):
当i<0时:
i+=self.alen
如果i>=self.alen:
提升索引器
返回i+self.start
定义获取项目(自我,i):
返回self.alist[self.adj(i)]
定义设置项(自身、i、v):
自我主义者[自我调整(i)]=v
定义(自我、i、v):
del self.alist[self.adj(i)]
self.alen-=1
def插件(自身、i、v):
self.alist.insert(self.adj(i),v)
self.alen+=1
类自定义:
定义初始化(自身,项目):
self.items=项目
def _u获取项目(自身,密钥):
如果isinstance(键、切片):
返回ListSlice(self.items、key.start、key.stop-key.start)
返回self.items[键]
自定义=自定义([1,2,3,4])
视图=自定义[1:3]
视图[0]=0
打印(自定义项目[1]==0)
打印(自定义项目)
印刷品:

True
[1, 0, 3, 4]

借用这个答案:

import collections.abc
类ListSlice(collections.abc.Sequence):
定义初始值(self、alist、start、alen):
自我主义者
self.start=开始
self.alen=alen
定义(自我):
返回self.alen
定义调整(自我,我):
当i<0时:
i+=self.alen
如果i>=self.alen:
提升索引器
返回i+self.start
定义获取项目(自我,i):
返回self.alist[self.adj(i)]
定义设置项(自身、i、v):
自我主义者[自我调整(i)]=v
定义(自我、i、v):
del self.alist[self.adj(i)]
self.alen-=1
def插件(自身、i、v):
self.alist.insert(self.adj(i),v)
self.alen+=1
类自定义:
定义初始化(自身,项目):
self.items=项目
def _u获取项目(自身,密钥):
如果isinstance(键、切片):
返回ListSlice(self.items、key.start、key.stop-key.start)
返回self.items[键]
自定义=自定义([1,2,3,4])
视图=自定义[1:3]
视图[0]=0
打印(自定义项目[1]==0)
打印(自定义项目)
印刷品:

True
[1, 0, 3, 4]

谢谢,但这并不是我想要的。。。代码段仍然返回false,问题是我需要将视图保存到一个新变量,而我仍然希望在从视图访问原始列表(部分)时对其进行修改…谢谢,但这并不是我想要的。。。代码段仍然返回false,问题是我需要将视图保存到一个新变量,而我仍然希望在从视图访问原始列表(部分)时修改它们。。。