python - 如何将嵌套的字典键作为类的属性返回?
问题描述
我的班级中有一个函数:getNested(),它将一堆数据作为嵌套字典获取。将这些数据转换为我可以在实例化类时使用的属性的最佳实践是什么?例如; 在下面的示例中运行 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' #
解决方案
实现您想要的一种方法是定义和使用一个从dict
. 然后,在这个类中,将嵌套字典的键设置为类的属性。
这看起来像:
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 样式
推荐阅读
- git - npm 将本地模块链接到特定分支
- html - 为什么我的背景图片没有纵向扩展
- delphi - 用鼠标正确移动旋转图形
- react-native - react native--无法修复意外的 TypeError(见屏幕截图)
- php - 当前用户和 env 用户在通过 php 和 apache 执行 shell 脚本时不匹配
- windows - Windows批处理脚本:提示后if语句不一致
- python - 为分类特征列指定形状?
- c++ - 具有自定义构造函数的类型的动态数组分配 (C++)
- ios - Is this possible to Set ViewController Storyboard ID programmatically?
- r - 理解 foreach