如何在Python中实现作用于实例属性的索引器/访问器

如何在Python中实现作用于实例属性的索引器/访问器,python,class,properties,Python,Class,Properties,基本目标:我将数据结构存储为类中的.data属性。这个类也可以有自己的属性和方法。我知道这里有一种类似的设计模式,例如熊猫数据框依赖于中的numpy narray。我特别希望在.data中有一个xarray对象,但在本次讨论中,它同样可以是一个pandas数据帧(甚至是一个列表!)。我想在我的类上有一个.loc(),.iloc(),.isel()或任何方法,然后将该索引应用于.data属性。它不能直接修改.data属性(在原始实例中),因为该属性应保持不变(否则您必须继续重新读取原始数据以重置实

基本目标:我将数据结构存储为类中的
.data
属性。这个类也可以有自己的属性和方法。我知道这里有一种类似的设计模式,例如熊猫数据框依赖于
中的numpy narray。我特别希望在
.data
中有一个xarray对象,但在本次讨论中,它同样可以是一个pandas数据帧(甚至是一个列表!)。我想在我的类上有一个
.loc()
.iloc()
.isel()
或任何方法,然后将该索引应用于
.data
属性。它不能直接修改
.data
属性(在原始实例中),因为该属性应保持不变(否则您必须继续重新读取原始数据以重置实例
.data
,这将是愚蠢的)。我认为保护
。\u data
属性将是一个技巧,pandas等人似乎在使用它,但我不认为这是一个优势。看起来无论如何我都必须制作(浅)副本,如:

class Mydata():
定义初始化(自身、属性、数据):
self.attr=attr
self.data=数据
def冷却方法(自):
打印(“你好世界”)
def isel(自我,索引):
从副本导入副本
输出=复制(自我)
out.data=out.data[索引]
返回
因此,现在我可以在我的类上调用
isel()
方法,它将
.data
属性子集,而不会丢失数据,因此:

mydata=mydata('a string',[0,1,2,3])
mydata.data
[0, 1, 2, 3]
mydata.attr
“一串”
mydata.coolmethod()
你好,世界
isel(2).数据
2.
isel(3).数据
3.
mydata.isel(3.attr)
“一串”
mydata.isel(3.coolmethod())
你好,世界
mydata.data
[0, 1, 2, 3]
上面的例子说明了我想要的行为。我可以在我的实例上调用索引器,它返回一个新实例,其中
.data
已修改(由索引器修改),但其他属性仍然存在,因此允许使用不同的索引反复调用该方法

关键似乎是做一个(肤浅的)拷贝。这是最好的设计模式吗?例如,我注意到熊猫确实使用
.values
.iloc
等的属性,
.iloc
返回一个
\u iLocIndexer
,但随后我对源代码的阅读变得冷淡了。这对我的用例来说太花哨了吗?定义我自己的
\u iLocIndexer
(不管是什么)的等价物会不会有点过分?我是否因为使用
.data
而不是创建一个从xarray或pandas等派生的类而使自己走上了一条艰难的道路

显然,我真正的
.data
会更有趣(即一个xarray数据集),我希望能够用它的
isel
sel
等索引器做同样的事情