假设有一个项目中有一个对象 classdic,该对象具有如下功能:
- 可以用类样式和字典样式的方式来查询、更新、添加和删除数据(称为“两种方式”)。
- 当一个属性或键不存在时,classdic 的实例可以自动构建它,并在实例和字典上都使其等于默认值,因此我们可以用两种方式查询它(注意:不能添加,只能查询)。
2、解决方案
代码例子
from collections import defaultdict, Mapping
class default_attribute_dict(defaultdict):
def __init__(self, *args, **kwargs):
super(default_attribute_dict, self).__init__(*args, **kwargs)
self.__dict__ = self
def __getattr__(self, name):
# trigger default
return self[name]
@classmethod
def from_dictionaries(cls, d, default=lambda: None):
cdic = cls(default)
for key, value in d.iteritems():
if isinstance(value, Mapping):
value = cls.from_dictionaries(value, default=default)
cdic[key] = value
return cdic
dic={'one':1,
'two':{'four':4,'five':{'six':6,'seven':7}},
'three':3}
cdic=default_attribute_dict(dic,default=100)
# 查询两种方式
print(cdic.one)
print(cdic['one'])
# 更新两种方式
cdic['two']['five']['six']=7
print(cdic.two.five.six)
cdic.two.five.six=8
print(cdic['two']['five']['six'])
# 添加两种方式
cdic['two']['five']['eight']=8
print(cdic.two.five.eight)
cdic.two.five.nine=9
print(cdic['two']['five']['nine'])
# 查询默认值两种方式
print(cdic['ten'])
print(cdic.ten)
# 最终状态
print(cdic)
这个程序的输出是:
1
1
7
8
8
9
100
100
{'eleven': 100, 'three': 3, 'two': {'four': 4, 'five': {'nine': 9, 'seven': 7, 'six': 8, 'eight': 8}}, 'ten': 100, 'one': 1}
答疑
1. 如何定义一个超级强大的类样式字典对象?
我们可以使用defaultdict来创建自定义的类样式字典对象。defaultdict是一个内置的Python类,它允许我们在创建字典时指定一个默认值。这使得我们可以轻松地创建具有默认值的嵌套字典。
2. 如何在类样式和字典样式之间进行转换?
我们可以使用__getattr__()和__setattr__()方法在类样式和字典样式之间进行转换。__getattr__()方法允许我们在访问不存在的属性时触发默认值。__setattr__()方法允许我们在设置不存在的属性时创建它。
3. 如何自动构建不存在的属性或键?
我们可以使用__getattr__()方法来自动构建不存在的属性或键。当我们访问不存在的属性时,__getattr__()方法将触发默认值。我们可以使用这个默认值来创建一个新的属性或键。
4. 如何在实例和字典上都使不存在的属性或键等于默认值?
我们可以使用__dict__属性在实例和字典上都使不存在的属性或键等于默认值。__dict__属性是字典的私有属性,它存储了字典中的键值对。我们可以通过在__getattr__()方法中访问__dict__属性来在实例上创建不存在的属性或键。我们也可以通过在__setattr__()方法中访问__dict__属性来在字典上创建不存在的属性或键。
5. 如何查询不存在的属性或键?
我们可以使用__getattr__()方法来查询不存在的属性或键。当我们访问不存在的属性时,__getattr__()方法将触发默认值。我们可以使用这个默认值来查询属性或键的值。
6. 如何添加不存在的属性或键?
我们可以使用__setattr__()方法来添加不存在的属性或键。当我们设置不存在的属性时,__setattr__()方法将创建它。我们可以使用这个属性或键的值来设置它的值。
7. 如何删除不存在的属性或键?
我们可以使用del语句来删除不存在的属性或键。当我们删除不存在的属性或键时,Python将抛出一个KeyError异常。我们可以使用这个异常来捕获删除不存在的属性或键的尝试。