在 Python 中将字典键作为属性访问

在 Python 中将字典键作为属性访问

Access dictionary Keys as Attributes in Python

将字典键作为属性访问:

  1. 在用户定义的类中扩展dict类。
  2. __getattr__方法设置为dict.__getitem__
  3. 设置__getattr__dict.__getitem__允许我们将字典键作为属性访问。
主程序
class AttributeDict(dict): __getattr__ = dict.__getitem__ __setattr__ = dict.__setitem__ __delattr__ = dict.__delitem__ my_dict = {'id': 1, 'name': 'Bobbyhadz', 'language': 'Python'} new_dict = AttributeDict(my_dict) print(new_dict.name) # 👉️ Bobbyhadz print(new_dict.language) # 👉️ Python new_dict.age = 30 # 👇️ {'id': 1, 'name': 'Bobbyhadz', 'language': 'Python', 'age': 30} print(new_dict) del new_dict.age # 👇️ {'id': 1, 'name': 'Bobbyhadz', 'language': 'Python'} print(new_dict)

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

_
_ getattr _ _方法
在默认属性访问失败并带有
AttributeError.

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

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

我们将类中
__getattr__方法设置为,因此每当用户尝试访问引发 an 的属性时,都会调用该方法。AttributeDictdict.__getitem__AttributeErrordict.__getitem__

在从字典中设置和删除键时,我们使用相同的方法来实现属性访问。

主程序
class AttributeDict(dict): __getattr__ = dict.__getitem__ __setattr__ = dict.__setitem__ __delattr__ = dict.__delitem__ my_dict = {'id': 1, 'name': 'Bobbyhadz', 'language': 'Python'} new_dict = AttributeDict(my_dict) new_dict.age = 30 # 👇️ {'id': 1, 'name': 'Bobbyhadz', 'language': 'Python', 'age': 30} print(new_dict) del new_dict.age # 👇️ {'id': 1, 'name': 'Bobbyhadz', 'language': 'Python'} print(new_dict)

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

我们设置将dict.__setitem__键添加到字典时调用的方法。

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

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

我们设置dict.__delitem__当用户从字典中删除键时调用的方法。

或者,您可以使用该__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, 'name': 'Bobbyhadz', 'language': 'Python'} new_dict = AttributeDict(my_dict) print(new_dict.id) # 👉️ 1 print(new_dict.name) # 👉️ Bobbyhadz new_dict.age = 30 # 👇️ {'id': 1, 'name': 'Bobbyhadz', 'language': 'Python', 'age': 30} print(new_dict) del new_dict['age'] # 👇️ {'id': 1, 'name': 'Bobbyhadz', 'language': 'Python'} print(new_dict)

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

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

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

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

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

在 Python 中将嵌套字典键作为属性访问

将嵌套的字典键作为属性访问:

  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', }, 'country': 'Example' } obj = Struct(**my_dict) print(obj.name.first) # 👉️ bobby print(obj.name.last) # 👉️ hadz print(obj.country) # 👉️ Example

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

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

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

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

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