Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python __getitem_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu_Python - Fatal编程技术网

Python __getitem_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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):

我想知道是否有解决办法。我创建了一个包含多个数组属性的类,这些属性通过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>
我有没有办法:

在同一类中同时使用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