在 Python 中从字典创建类实例
Creating class instances from a Dictionary in Python
从字典创建类实例:
- 从类的方法中获取字典
__init__()
。 - 遍历字典的项目。
- 使用该
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
我们**
在实例化类的时候使用了运算符来解包字典的键值对。
您可以想象字典的键值对作为关键字参数传递给类。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: