如何将嵌套字典键作为类的属性返回?

2024-09-28 15:31:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我的类中有一个函数:getNested(),它作为嵌套字典获取一组数据。将这些数据转换为属性的最佳实践是什么,然后我可以在实例化类时使用这些属性?如;运行下面示例中的line test.nestedDict.A,理想情况下会返回{'Aa':['1','2','3',],'Ab':'item'}

class MyClass( object ):
    def __init__( self ):
        self._nestedDict = None
        self.getNested()
    
    def getNested( self ):
        self._nestedDict = {'A':{'Aa': ['1', '2', '3',], 'Ab':'item'}, 'B':{'Ba': ['4', '5', '6',], 'Bb':'item2'} }
        
    @property    
    def nestedDict( self ):
        return self._nestedDict
        
test = MyClass()

test.nestedDict
# Result: {'A': {'Aa': ['1', '2', '3'], 'Ab': 'item'},'B': {'Ba': ['4', '5', '6'], 'Bb': 'item2'}} # 
test.nestedDict['A']
# Result: {'Aa': ['1', '2', '3'], 'Ab': 'item'} # 
test.nestedDict.A
# Error: AttributeError: line 1: 'dict' object has no attribute 'A' # 

Tags: 数据testself属性abobjectdefline
1条回答
网友
1楼 · 发布于 2024-09-28 15:31:36

实现所需的一种方法是定义并使用从dict继承的helper类。然后,在此类中,将嵌套字典的键设置为该类的属性

这看起来像:

class Nested(dict):
    def __init__(self, dict_):
        super(Nested, self).__init__()
        for k, v in dict_.items():
            if isinstance(v, dict):
                v = Nested(v)
            setattr(self, k, v)
            self.update({k: v})


class MyClass:
    def __init__(self):
        self.set_nested()

    def set_nested(self):
        nested_dict = {'A': {'Aa': ['1', '2', '3'], 'Ab': 'item'},
                       'B': {'Ba': ['4', '5', '6'], 'Bb': 'item2'}}
        self._nested_dict = Nested(nested_dict)

    @property
    def nested_dict( self ):
        return self._nested_dict

然后,您可以使用它执行以下操作:

>>> test = MyClass()
>>> test.nested_dict
{'A': {'Aa': ['1', '2', '3'], 'Ab': 'item'}, 'B': {'Ba': ['4', '5', '6'], 'Bb': 'item2'}}
>>> test.nested_dict.A
{'Aa': ['1', '2', '3'], 'Ab': 'item'}
>>> test.nested_dict.A.Aa
['1', '2', '3']
>>> test.nested_dict.A.Ab
'item'
>>> test.nested_dict['A']
{'Aa': ['1', '2', '3'], 'Ab': 'item'}

请注意,我允许自己更改变量和方法的名称以符合PEP8 styling

相关问题 更多 >