如何在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
等索引器做同样的事情