使用点“.” 在 Python 中访问字典键的符号

目录

Using dot “.” notation to access dictionary keys in Python

  1. 使用点“.” 在 Python 中访问字典键的符号
  2. 为不存在的键返回 None 而不是引发错误
  3. 使用点“.” 使用_ _ dict _ _访问字典键的表示法
  4. 访问不存在的键时引发 AttributeError 异常
  5. 使用点“.” 访问嵌套字典键的符号

使用点“.” 在 Python 中访问字典键的符号

要使用点表示法访问字典键:

  1. dict在定义类时扩展类。
  2. __getattr__方法设置为dict.__getitem__
  3. 将属性访问重定向到dict.__getitem__允许我们使用点符号来访问字典键。
主程序
class AttributeDict(dict): __getattr__ = dict.__getitem__ __setattr__ = dict.__setitem__ __delattr__ = dict.__delitem__ my_dict = {'id': 1, 'website': 'bobbyhadz.com', 'topic': 'Python'} new_dict = AttributeDict(my_dict) print(new_dict.website) # 👉️ bobbyhadz.com print(new_dict.topic) # 👉️ Python new_dict.author = 'Borislav Hadzhiev' # 👇️ {'id': 1, 'website': 'bobbyhadz.com', 'topic': 'Python', 'author': 'Borislav Hadzhiev'} print(new_dict) del new_dict.author # 👇️ {'id': 1, 'website': 'bobbyhadz.com', 'topic': 'Python'} print(new_dict)

该类AttributeDict扩展了内置dict类。

我们将__getattr__方法设置为dict.__getitem__访问字典的键作为属性。

_ _ getattr _ _方法

在默认属性访问失败并带有
AttributeError.

换句话说,__getattr__()只为不存在的属性调用。

dict.__getitem__当我们使用方括号访问字典键时调用该方法,例如my_dict['name']calls my_dict.__getitem__('name')

我们将类__getattr__中的方法设置AttributeDict
dict.__getitem__,因此每当用户尝试访问不存在的属性时,dict.__getitem__都会调用该方法。

当从字典中设置和删除键时,我们使用相同的方法能够使用点表示法。

主程序
class AttributeDict(dict): __getattr__ = dict.__getitem__ __setattr__ = dict.__setitem__ __delattr__ = dict.__delitem__ my_dict = {'id': 1, 'website': 'bobbyhadz.com', 'topic': 'Python'} new_dict = AttributeDict(my_dict) # ✅ add a key to the dictionary new_dict.author = 'Borislav Hadzhiev' # 👇️ {'id': 1, 'website': 'bobbyhadz.com', 'topic': 'Python', 'author': 'Borislav Hadzhiev'} print(new_dict) # ✅ delete a key from the dictionary del new_dict.author # 👇️ {'id': 1, 'website': 'bobbyhadz.com', 'topic': 'Python'} print(new_dict)

对象
_ _ setattr _ _
方法在尝试分配属性时调用。

我们将方法设置为
dict。_ _ setitem _ _
将键添加到字典时调用。

例如,my_dict['key'] = 'value'调用. my_dict.__setitem__('key', 'value')

对象
_ _ delattr _ _
方法在使用运算符删除属性时调用
del

我们将方法设置为
dict。_ _ delitem _ _
当用户从字典中删除键时调用。

例如,后台调用del my_dict['key'] my_dict.__delitem__('key')

为不存在的键返回 None 而不是引发错误

当我们访问字典中不存在的键时,dict.__getitem__方法会引发 a 。KeyError

如果您宁愿返回None不存在的键,请设置__getattr__
dict.get.

主程序
class AttributeDict(dict): __getattr__ = dict.get __setattr__ = dict.__setitem__ __delattr__ = dict.__delitem__ my_dict = {'id': 1, 'website': 'bobbyhadz.com', 'topic': 'Python'} new_dict = AttributeDict(my_dict) print(new_dict.example) # 👉️ None print(new_dict.website) # 👉️ bobbyhadz.com print(new_dict.topic) # 👉️ Python

如果键在字典中,则 dict.get 方法返回给定键的值,否则返回默认

该方法采用以下 2 个参数:

姓名 描述
钥匙 返回值的键
默认 如果字典中不存在提供的键,则返回默认值(可选)

default如果未提供参数值,则默认为None,因此该get()方法永远不会引发KeyError.

或者,您可以使用该__dict__属性。

使用点“.” 使用_ _ dict _ _访问字典键的表示法

这是一个三步过程:

  1. dict在定义类时扩展类。
  2. dict在您的用户定义类中调用该类的构造函数。
  3. 将属性设置__dict__为当前实例。
主程序
class AttributeDict(dict): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.__dict__ = self my_dict = {'id': 1, 'website': 'bobbyhadz.com', 'topic': 'Python'} new_dict = AttributeDict(my_dict) print(new_dict.website) # 👉️ bobbyhadz.com print(new_dict.topic) # 👉️ Python # ✅ add a key to the dictionary new_dict.author = 'Borislav Hadzhiev' # 👇️ {'id': 1, 'website': 'bobbyhadz.com', 'topic': 'Python', 'author': 'Borislav Hadzhiev'} print(new_dict) # ✅ delete a key from the dictionary del new_dict.author # 👇️ {'id': 1, 'website': 'bobbyhadz.com', 'topic': 'Python'} print(new_dict)

类的
_ _ init _ _ ()dict方法的第一行使用提供的参数运行类的构造函数。通过这样做,我们的AttributeDict班级表现得像一本字典。

self.__dict__ = self行将属性设置__dict__为当前实例。

默认情况下,__dict__属性返回包含对象的属性和值的字典。

在我们的例子中,__dict__属性指向dict允许属性访问的子类。

访问不存在的key时抛出AttributeError异常

使用此方法时需要注意的一点是,当您使用点表示法访问字典中不存在的键时,会AttributeError引发 an 而不是KeyError.

主程序
class AttributeDict(dict): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.__dict__ = self my_dict = {'id': 1, 'website': 'bobbyhadz.com', 'topic': 'Python'} new_dict = AttributeDict(my_dict) # ⛔️ AttributeError: 'AttributeDict' object has no attribute 'example' print(new_dict.example)

如果您需要访问嵌套的字典键作为属性,请使用下一个代码片段中的类。

使用点“.” 访问嵌套字典键的符号

要使用点表示法访问嵌套的字典键:

  1. __init__在类的方法中迭代字典的项目。
  2. 如果键的值为 type dict,则使用该值实例化类。
  3. 否则,将键设置为值。
主程序
class Struct: def __init__(self, **kwargs): for key, value in kwargs.items(): if isinstance(value, dict): self.__dict__[key] = Struct(**value) else: self.__dict__[key] = value my_dict = { 'name': { 'first': 'bobby', 'last': 'hadz', }, 'website': 'bobbyhadz.com' } obj = Struct(**my_dict) print(obj.name.first) # 👉️ bobby print(obj.name.last) # 👉️ hadz print(obj.website) # 👉️ bobbyhadz.com

该类Struct采用关键字参数并使用__dict__对象的属性将
嵌套字典转换为对象

在每次迭代中,我们检查当前键是否指向字典,如果是,我们递归地将字典传递给类Struct

如果键不指向嵌套字典,我们将其添加到__dict__
属性中。

您可以使用点表示法访问对象上的嵌套属性。

如果您尝试访问对象上不存在的属性,则会
AttributeError引发 。

我还写了一篇关于
如何使用变量访问字典键的文章。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: