如何解决如何在 Python 中实现作用于实例属性的索引器/访问器
基本目标:我将数据结构存储为类中的 .data
属性。这个类也可以有自己的属性和方法。我知道这里有一个类似的设计模式,例如,pandas DataFrame 依赖于 .values
中的 numpy narray。我特别希望在 .data
中有一个 xarray 对象,但对于本次讨论,它同样可以是一个 Pandas DataFrame(甚至是一个列表!)。我想在我的类上有一个 .loc()
、.iloc()
、.isel()
或任何方法,然后将该索引应用于 .data
属性。它不能直接修改 .data
属性(在原始实例中),因为它应该保持不变(否则您必须不断重新读取原始数据以重置您的实例 .data
,这将是愚蠢)。我认为保护 ._data
属性是诀窍,pandas 等似乎在使用,但在这里看不出它的优势。看起来我无论如何都必须制作(浅)副本,例如:
class Mydata():
def __init__(self,attr,data):
self.attr = attr
self.data = data
def coolmethod(self):
print("Hello world")
def isel(self,index):
from copy import copy
out = copy(self)
out.data = out.data[index]
return out
所以现在我可以在我的类上调用 isel()
方法,并且它在不丢失数据的情况下对 .data
属性进行子集化,因此:
mydata = Mydata('a string',[0,1,2,3])
mydata.data
[0,3]
mydata.attr
'a string'
mydata.coolmethod()
Hello world
mydata.isel(2).data
2
mydata.isel(3).data
3
mydata.isel(3).attr
'a string'
mydata.isel(3).coolmethod()
Hello world
mydata.data
[0,3]
上面的例子说明了我想要的行为。我可以在我的实例上调用一个索引器,它返回一个修改了 .data
的新实例(由索引器),但其他属性仍然存在,从而允许使用不同的索引一次又一次地调用该方法。>
关键似乎是制作(浅)副本。不过,这是最好的设计模式吗?我注意到,例如,pandas 确实使用了 .values
和 .iloc
等的属性,.iloc
返回了一个 _iLocIndexer
,但随后我对源代码的阅读就变冷了。这对我的用例来说太花哨了吗?定义我自己的 _iLocIndexer
等价物(不管它是什么)会不会太过分?我是否通过使用 .data
而不是创建从 xarray 或 pandas 等子类化的类让自己走上了艰难的道路?
显然,我真正的 .data
会更有趣(即 xarray 数据集),我希望能够用它的 isel
和 sel
等索引器做同样的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。