__getitem__且没有括号(或与__get__同​​时)

时间:2015-10-09 10:38:42

标签: python

我想知道是否有解决方法。我创建了一个包含多个数组属性的类,这些属性通过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__,而不使用括号?

0 个答案:

没有答案