我想知道是否有解决方法。我创建了一个包含多个数组属性的类,这些属性通过Pandas'存储在光盘中。 HDFStore。下面是该类的简化版本,它只包含其中一个属性:
import pandas as pd
import warnings
warnings.filterwarnings('ignore',category=pd.io.pytables.PerformanceWarning)
class Data(object):
class FileArray(object):
def __init__(self, filename, key):
self.filename = filename
self.key = key
def __get__(self, instance, owner):
print('get')
try:
store = pd.HDFStore(self.filename, mode='r')
array = store[self.key].values
store.close()
except KeyError:
store.close()
array = None
return(array)
def __set__(self, instance, array):
print('set')
if array != None:
store = pd.HDFStore(self.filename)
store[self.key] = pd.DataFrame(array)
store.close()
def __getitem__(self, pos):
print('get item')
if type(pos) != tuple or len(pos) != 2:
raise IndexError('Index must be a tuple of length 2')
y, x = pos
try:
store = pd.HDFStore(self.filename, mode='r')
array = store[self.key].values
store.close()
value = array[y][x]
except KeyError:
store.close()
value = None
return value
def __setitem__(self, pos, value):
print('set_item')
if type(pos) != tuple or len(pos) != 2:
raise IndexError('Index must be a tuple of length 2')
x, y = pos
try:
store = pd.HDFStore(self.filename)
array = store[self.key].values
array[x,y] = value
store[self.key] = pd.DataFrame(array)
store.close()
except KeyError:
store.close()
# Class data definition
def __init__(self, filename):
self.filename = filename
setattr(self.__class__, 'array', self.FileArray(self.filename, 'array') )
如果我删除了__get__类,一切似乎都按预期工作:
>>> data = Data('file')
>>> data.array = np.random.rand(10,10)
set
>>> data.array[0,0]
get item
0.82546762173073829
>>> data.array[0,0] = 10
set_item
>>> data.array[0,0]
get item
10.0
但是,我无法通过删除括号来获取数组:
>>> data.array
<__main__.FileArray object at 0x09507D30>
如果我包含__get__
方法,则data.array按预期工作。但是,从那一刻开始,即使我使用括号,也始终会调用__get__
。因此,我不能使用括号来修改存储在磁盘中的数组的各个元素:
>>> data = Data('file')
>>> data.array = np.random.rand(10,10)
set
>>> data.array[0,0]
get
0.38273033820794067
>>> data.array[0,0] = 10
get
>>> data.array[0,0]
get
0.38273033820794067
我有什么方法可以:
__get__
和__getitem__
同时在同一个班级中同时使用__setitem__
?__getitem__
和__setitem__
,而不使用括号?