目录
Using dot “.” notation to access dictionary keys in Python
- 使用点“.” 在 Python 中访问字典键的符号
- 为不存在的键返回 None 而不是引发错误
- 使用点“.” 使用_ _ dict _ _访问字典键的表示法
- 访问不存在的键时引发 AttributeError 异常
- 使用点“.” 访问嵌套字典键的符号
使用点“.” 在 Python 中访问字典键的符号
要使用点表示法访问字典键:
dict
在定义类时扩展类。- 将
__getattr__
方法设置为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) 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 _ _访问字典键的表示法
这是一个三步过程:
dict
在定义类时扩展类。dict
在您的用户定义类中调用该类的构造函数。- 将属性设置
__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)
如果您需要访问嵌套的字典键作为属性,请使用下一个代码片段中的类。
使用点“.” 访问嵌套字典键的符号
要使用点表示法访问嵌套的字典键:
__init__
在类的方法中迭代字典的项目。- 如果键的值为 type
dict
,则使用该值实例化类。 - 否则,将键设置为值。
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
引发 。
我还写了一篇关于
如何使用变量访问字典键的文章。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: