Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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 如何使类函数类似于嵌套字典? 我想做什么_Python - Fatal编程技术网

Python 如何使类函数类似于嵌套字典? 我想做什么

Python 如何使类函数类似于嵌套字典? 我想做什么,python,Python,我试图创建一个可以存储和操作多组数据的类 然而,我在尽可能简单直观地访问数据方面遇到了困难。该对象本质上只是一个嵌套字典,其布局类似于: data={“File1\u Column1”:{“header”:[…], “数据”:[…]}, “File1_Column2:{'header':[…], “数据”:[…]},…} 我想发生什么 假设我有一个名为data的此类实例,我希望data['File1\u Column1']['header']和data['File1\u Column1']['

我试图创建一个可以存储和操作多组数据的类

然而,我在尽可能简单直观地访问数据方面遇到了困难。该对象本质上只是一个嵌套字典,其布局类似于:

data={“File1\u Column1”:{“header”:[…],
“数据”:[…]},
“File1_Column2:{'header':[…],
“数据”:[…]},…}
我想发生什么 假设我有一个名为
data
的此类实例,我希望
data['File1\u Column1']['header']
data['File1\u Column1']['data']
返回人们期望的结果,但我也希望
data['File1\u Column1']
返回与
data['File1\u Column1']['data']相同的结果。我想要这个,因为我可以预见自己99%的时间都在使用数据列表,这将使它更方便

通过简单地利用
\uu getitem\uuuu
,前两种方法非常简单,但是,我真的很难让后一种方法发挥作用

我得到的最接近的结果显示在下面的简化代码中。我曾尝试以各种方式对
数据
类的
\uuuu getitem\uuuu
方法实现if语句,检查
下标
类的
\uu getitem\uuuu
方法是否被调用,但没有成功

我已经试过了
类数据:
定义初始化(自):
self._data={}
def附加(自身、标签、数据):
自身数据[标签]=数据
定义获取项目(自我,标签):
类下标:
定义初始化(自身,数据):
self.\u data=数据
定义获取项目(自我,标签):
返回自。\u数据[标签]
子数据=下标(自身数据[标签])
返回子数据
数据=数据()
示例={'header':['Trace','Unit'],'data':[1,2,3,4]}
data.append('Label',示例)
打印(数据[“标签])
打印(数据['Label']['data'])
打印(数据['Label']['header'])
结果
有什么方法可以做到这一点吗?

可以使用repr方法来做到这一点

您可以向下标类添加repr方法

def __repr__(self):
    return str(self._data['data'])
下面是repr方法的代码和添加的示例-

class Data:

    def __init__(self):
        self._data = {}

    def append(self, label, data):
        self._data[label] = data

    def __getitem__(self, label):


        class Subscript:

            def __init__(self, data):
                self._data = data
                self.label = label

            def __getitem__(self, label):
                self.label = label
                return self._data[label]

            def __repr__(self):
                return str(self._data['data'])

        subdata = Subscript(self._data[label])
        return subdata

data = Data()
example = {'header': ['Trace', 'Unit'], 'data': [1, 2, 3, 4]}
example2 = {'header': ['Trace2', 'Unit2'], 'data': [11, 22, 33, 42]}
data.append('Label', example)
data.append('Label2', example2)
print(data['Label'])
print(data['Label']['data'])
print(data['Label']['header'])
print(data['Label2'])
print(data['Label2']['data'])
print(data['Label2']['header'])
结果(你期望发生的事情)-
也许您只需对不同的项目使用两个DICT:

headers= { "File1_Column1": ...,
            "File1_Column2": ...
            },

data  = {"File1_Column1": ..., 
          "File1_Column2": ...}

您想如何区分调用对象中的列(
data['File1\u Column1']
)和调用列中的数据(
data['File1\u Column1']
)?不要认为这是可能的。您希望
数据['Label']
根据
数据['Label']
后面的内容计算为
下标或
[1,2,3,4]
。因为python看不到未来,所以这是不可能的。我认为是这样的,但我希望有一些东西是我看不到的。谢谢这只会改变对象的外观,而不会改变它的实际情况。你把你的对象放在一个小列表中,但是试着像它看起来一样使用它,它会完全失败。
class Data:

    def __init__(self):
        self._data = {}

    def append(self, label, data):
        self._data[label] = data

    def __getitem__(self, label):


        class Subscript:

            def __init__(self, data):
                self._data = data
                self.label = label

            def __getitem__(self, label):
                self.label = label
                return self._data[label]

            def __repr__(self):
                return str(self._data['data'])

        subdata = Subscript(self._data[label])
        return subdata

data = Data()
example = {'header': ['Trace', 'Unit'], 'data': [1, 2, 3, 4]}
example2 = {'header': ['Trace2', 'Unit2'], 'data': [11, 22, 33, 42]}
data.append('Label', example)
data.append('Label2', example2)
print(data['Label'])
print(data['Label']['data'])
print(data['Label']['header'])
print(data['Label2'])
print(data['Label2']['data'])
print(data['Label2']['header'])
Shreyashs-MacBook-Pro:~ shreyash$ python test.py 
[1, 2, 3, 4]
[1, 2, 3, 4]
['Trace', 'Unit']
[11, 22, 33, 42]
[11, 22, 33, 42]
['Trace2', 'Unit2']
headers= { "File1_Column1": ...,
            "File1_Column2": ...
            },

data  = {"File1_Column1": ..., 
          "File1_Column2": ...}