如何使 Python 字典成员可通过点“。”访问?
例如,mydict['val']我不想写 ,而想写mydict.val。
mydict['val']
mydict.val
我也想通过这种方式访问嵌套的字典。例如
mydict.mydict2.val
指的是
mydict = { 'mydict2': { 'val': ... } }
要实现通过点(.)符号访问 Python 字典的成员,可以创建一个自定义类,该类模拟字典行为但允许使用属性风格的访问。这可以通过继承 dict 类并实现 __getattr__ 和 __setattr__ 方法来实现。
.
dict
__getattr__
__setattr__
下面是如何实现这一点的步骤:
你可以创建一个名为 DotDict 的类,该类继承自 dict 并提供点符号访问:
DotDict
class DotDict(dict): def __getattr__(self, item): if item in self: value = self[item] # 递归地将嵌套的字典转换为 DotDict if isinstance(value, dict): return DotDict(value) return value raise AttributeError(f"'{self.__class__.__name__}' 对象没有属性 '{item}'") def __setattr__(self, key, value): self[key] = value def __delattr__(self, key): if key in self: del self[key] else: raise AttributeError(f"'{self.__class__.__name__}' 对象没有属性 '{key}'")
你可以使用这个类来创建可以通过点符号访问的字典:
# 示例用法 mydict = DotDict({ 'mydict2': { 'val': 42, 'nested': { 'value': 99 } } }) print(mydict.mydict2.val) # 输出: 42 print(mydict.mydict2.nested.value) # 输出: 99 # 设置值 mydict.mydict2.val = 100 print(mydict.mydict2.val) # 输出: 100 # 删除值 del mydict.mydict2.val print(mydict.mydict2.val) # 引发 AttributeError
继承 dict: DotDict 类继承自 Python 内置的 dict,允许它使用所有标准字典功能。
__getattr__: 当你尝试访问属性时,这个方法被调用。它检查该属性是否存在于字典中。如果存在,它返回该值,并将嵌套字典转换为 DotDict 实例,以支持嵌套项目的点符号访问。
__setattr__: 这个方法允许你使用点符号设置字典项。
__delattr__: 这个方法允许你使用点符号删除字典项。
__delattr__
如果字典包含可能与特殊方法冲突的键,或者你需要更复杂的行为,你可能需要扩展这个实现。然而,对于大多数情况,这种方法应该足够了。
这个自定义类提供了一种干净且可读的方式来通过点符号访问字典成员,包括嵌套字典。