在 Python 中从字典创建类实例

在 Python 中从字典创建类实例

Creating class instances from a Dictionary in Python

从字典创建类实例:

  1. 从类的方法中获取字典__init__()
  2. 遍历字典的项目。
  3. 使用该setattr方法将每个键值对分配为实例属性。
主程序
class Developer(): def __init__(self, dictionary): for key, value in dictionary.items(): setattr(self, key, value) my_dict = {'name': 'bobbyhadz', 'salary': 50, 'language': 'Python'} bob = Developer(my_dict) print(bob.name) # 👉️ bobbyhadz print(bob.salary) # 👉️ 50 print(bob.language) # 👉️ Python

_ _ init _ _ ()方法采用字典并将其键值对设置为实例属性。

我们使用for 循环遍历字典的项目。

dict.items
方法返回字典项((键,值)对)的新视图

主程序
my_dict = {'name': 'bobbyhadz', 'salary': 50, 'language': 'Python'} # 👇️ dict_items([('name', 'bobbyhadz'), ('salary', 50), ('language', 'Python')]) print(my_dict.items())

在每次迭代中,我们使用setattr()
函数将每个键值对设置为实例的一个属性。

主程序
for key, value in dictionary.items(): setattr(self, key, value)

setattr()函数将对象、属性名称和值作为参数。

创建实例时使用关键字参数

您还可以调整__init__()方法以在字典后采用关键字参数。

主程序
class Developer(): def __init__(self, dictionary, **kwargs): # 👇️ {'name': 'bobbyhadz', 'salary': 50, 'language': 'Python'} print(dictionary) # 👇️ {'tasks': ['develop', 'test'], 'age': 30} print(kwargs) for key, value in dictionary.items(): setattr(self, key, value) for key, value in kwargs.items(): setattr(self, key, value) my_dict = {'name': 'bobbyhadz', 'salary': 50, 'language': 'Python'} bob = Developer(my_dict, tasks=['develop', 'test'], age=30) print(bob.name) # 👉️ bobbyhadz print(bob.tasks) # 👉️ ['develop', 'test']

该类的__init__()方法可选择在字典后采用关键字参数。

但是,如果您没有,则不需要传递关键字参数。

用下划线替换字典键中的空格

如果您的字典包含带空格的键,请使用该str.replace()方法将每个空格替换为下划线。

主程序
class Developer(): def __init__(self, dictionary): for key, value in dictionary.items(): setattr(self, str(key).replace(' ', '_'), value) my_dict = {'first name': 'bobbyhadz', 'salary': 50, 'language': 'Python'} bob = Developer(my_dict) print(bob.first_name) # 👉️ bobbyhadz print(bob.salary) # 👉️ 50 print(bob.language) # 👉️ Python

first name包含一个空格,因此我们使用该str.replace()方法将字典键中的任何空格替换为下划线。

将属性初始化为 None

如果您在尝试访问每个实例的属性时遇到 linting 错误,例如“‘Developer’类型的实例没有‘X’成员”,请将属性初始化为None.

主程序
class Developer(): def __init__(self, dictionary): self.name = None self.salary = None self.language = None for key, value in dictionary.items(): setattr(self, str(key).replace(' ', '_'), value) my_dict = {'first name': 'bobbyhadz', 'salary': 50, 'language': 'Python'} bob = Developer(my_dict) print(bob.name) # 👉️ bobbyhadz print(bob.salary) # 👉️ 50 print(bob.language) # 👉️ Python

我们将所有属性初始化为None,因此我们可以访问每个实例上的属性而不会出现 linting 错误。

使用解包从字典创建类实例

要考虑的另一种方法是在方法中定义属性
__init__(),并在实例化类时解压缩字典的键值对。

主程序
class Developer(): def __init__(self, name, salary, language): self.name = name self.salary = salary self.language = language my_dict = {'name': 'bobbyhadz', 'salary': 50, 'language': 'Python'} bob = Developer(**my_dict) print(bob.name) # 👉️ bobbyhadz print(bob.salary) # 👉️ 50 print(bob.language) # 👉️ Python

我们**在实例化类的时候使用了运算符来解包字典的键值对。

您可以想象字典的键值对作为关键字参数传递给类。

额外资源

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