在 Python 中将字典键作为属性访问
Access dictionary Keys as Attributes in Python
将字典键作为属性访问:
- 在用户定义的类中扩展
dict
类。 - 将
__getattr__
方法设置为dict.__getitem__
。 - 设置
__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 的属性时,都会调用该方法。AttributeDict
dict.__getitem__
AttributeError
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) 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 _ _ 访问字典键作为属性
将字典键作为属性访问:
- 在用户定义的类中扩展
dict
类。 - 调用
dict
类的构造函数。 - 将
__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 中将嵌套字典键作为属性访问
将嵌套的字典键作为属性访问:
__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', }, '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
则会引发 。