Python __getitem_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
我想知道是否有解决办法。我创建了一个包含多个数组属性的类,这些属性通过Pandas的HDFStore存储在光盘中。下面是该类的简化版本,仅包含其中一个属性:Python __getitem_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,python,Python,我想知道是否有解决办法。我创建了一个包含多个数组属性的类,这些属性通过Pandas的HDFStore存储在光盘中。下面是该类的简化版本,仅包含其中一个属性: import pandas as pd import warnings warnings.filterwarnings('ignore',category=pd.io.pytables.PerformanceWarning) class Data(object): class FileArray(object):
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>
我有没有办法:
在同一类中同时使用uuu get_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?
或者,调用了uuu getitem和uuu setitem而不使用括号?
我不清楚你想达到什么目的。为什么希望类成为描述符;我的目标是创建一个具有一组数组属性的类。我应该能够像处理普通的numpy阵列一样处理阵列,但实际将它们存储在磁盘中。任何值的更改都应该立即存储到磁盘中。在这种情况下,我认为您需要使用一个常规的@property,但让它返回一些提供数组接口的内容,同时用存储对其进行备份。试图把两者都塞进一个物体肯定会让人头疼!我不知道如何在没有_get _方法的情况下实现数组接口。。。一旦我实现了这个方法,我将面临同样的问题。Numpy的数组不实现uuu get uu,这是。你为什么认为你需要它?
>>> 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