Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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 类通过属性访问嵌套的DIC,并通过打印和__dict显示不同的值___Python_Class_Dictionary_Data Structures_Instance - Fatal编程技术网

Python 类通过属性访问嵌套的DIC,并通过打印和__dict显示不同的值__

Python 类通过属性访问嵌套的DIC,并通过打印和__dict显示不同的值__,python,class,dictionary,data-structures,instance,Python,Class,Dictionary,Data Structures,Instance,我正在从事一个项目,在这个项目中,我需要具有一些属性(例如日期、名称)的对象,然后是一组值(通常是具有不同聚合的pd.DataFrames,但这里我将使用整数作为示例)。使用data.df.yearly访问值会更容易,而不是执行多个嵌套dict并为data[“df”][“yearal”]等键键入许多额外字符。(有更好的结构吗?) 因此,我使用了一个将键设置为属性的类。但根据我访问数据的方式,我会得到不同的输出 代码如下: class Map(dict): ""&quo

我正在从事一个项目,在这个项目中,我需要具有一些属性(例如日期、名称)的对象,然后是一组值(通常是具有不同聚合的pd.DataFrames,但这里我将使用整数作为示例)。使用data.df.yearly访问值会更容易,而不是执行多个嵌套dict并为data[“df”][“yearal”]等键键入许多额外字符。(有更好的结构吗?)

因此,我使用了一个将键设置为属性的类。但根据我访问数据的方式,我会得到不同的输出

代码如下:

class Map(dict):
    """
    https://stackoverflow.com/questions/2352181/how-to-use-a-dot-to-access-members-of-dictionary
    Example:
    m = Map({'first_name': 'Eduardo'}, last_name='Pool', age=24, sports=['Soccer'])
    """
    def __init__(self, *args, **kwargs):
        super(Map, self).__init__(*args, **kwargs)
        for arg in args:
            if isinstance(arg, dict):
                for k, v in arg.items():
                    self[k] = v

        if kwargs:
            for k, v in kwargs.items():
                self[k] = v

    def __getattr__(self, attr):
        super( Map, self ).__getattr__( attr )
        return self.get(attr)

    def __setattr__(self, key, value):
        self.__setitem__(key, value)

    def __setitem__( self, key, value ):
        super( Map, self ).__setitem__( key, value )
        if isinstance( value, dict ):
            self.__dict__.update( {key: Map(value) } )         
        else:
            self.__dict__.update( {key: value} )

    def __delattr__(self, item):
        self.__delitem__(item)

    def __delitem__(self, key):
        super(Map, self).__delitem__(key)
        del self.__dict__[key]   
现在,当我初始化一个实例并按以下方式为其分配一些数据时,我将有两个不同的输出,这取决于我是写入data.df.yearal还是data.df[“yearal”]

是否有人发现了错误(或者是否有更好的数据结构的建议?。

创建Map()的实例

更改data.df的值

for time in data.df.keys():
    data.df[time] = 123
预期产出:

data
> {'start_date': '2020-01-01',
>  'finish_date': '2021-01-01',
>  'name': 'Type A',
>  'df': {'yearly': 123, 'monthly': 123, 'weekly': 123}}
data.__dict__
> {'start_date': '2020-01-01',
>  'finish_date': '2021-01-01',
>  'name': 'Type A',
>  'df': {'yearly': 123, 'monthly': 123, 'weekly': 123}}
输出(与打印(数据)相同):

通过dict的输出与预期输出匹配:

data
> {'start_date': '2020-01-01',
>  'finish_date': '2021-01-01',
>  'name': 'Type A',
>  'df': {'yearly': 123, 'monthly': 123, 'weekly': 123}}
data.__dict__
> {'start_date': '2020-01-01',
>  'finish_date': '2021-01-01',
>  'name': 'Type A',
>  'df': {'yearly': 123, 'monthly': 123, 'weekly': 123}}

您的
\uuuuu setitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。所以这两个位置包含不同的对象,没有任何东西可以保持它们的同步

在将值存储在两个位置之前,应将其转换为映射

    def __setitem__( self, key, value ):
        if isinstance(value, dict):
            value = Map(value)
        super( Map, self ).__setitem__( key, value )
        self.__dict__.update({key: value})

你的
\uuuu setitem\uuuuuu
方法与你提到的问题中的方法不同。是的,我在回答中添加了注释,这样
m.new\u key={'foo':'bar'}
返回
bar
m.new\u key.foo
。这样,子目录也是类Map()的实例。