我是python中的新手,我试图在类中动态创建新实例。那么,让我举个例子,如果我有这样的课程:
<pre id="results"></pre>
据我所知,对于我必须插入的每个新实例,我必须声明一个变量并将其附加到person对象,如下所示:
class Person(object):
def __init__(self, name, age, job):
self.name = name
self.age = age
self.job = job
有没有办法动态地做到这一点?让我们假设我有一个这样的字典:
variable = Person(name, age, job)
我可以创建一段代码来迭代这个数据库并自动在persons_database = {
'id' : ['name', age, 'job'], .....
}
类中创建新实例吗?
答案 0 :(得分:1)
使用for循环遍历字典。
people = []
for id in persons_database:
info = persons_database[id]
people.append(Person(info[0], info[1], info[2]))
然后,列表people
将包含Person
个对象,其中包含来自persons_database词典的数据
如果需要从原始id获取Person对象,可以使用字典存储Person对象,并可以快速找到正确的Person。
people = {}
for id, data in persons_database.items():
people[id] = Person(data[0], data[1], data[2])
然后你可以通过people[id]
从他/她的身份中找到你想要的人。因此,为了增加id = 1岁的人,您可以people[1].increment_age()
------下面有一些更高级的材料----------------
有些人提到使用列表/字典理解来实现你想要的。理解会更有效率和更多pythonic,但如果你是编程/ python的新手,则更难理解
作为字典理解,第二段代码是people = {id: Person(*data) for id, data in persons_database.items()}
所以这里没有什么是无法解释的...... python中List之前的*
将列表作为列表的连续顺序中的单独项目解压缩,因此对于长度为n的List l
,*l
将评估为l[0], l[1], ... , l[n-2], l[n-1]
答案 1 :(得分:0)
当然,一个简单的list comprehension应该可以解决问题:
people = [Person(*persons_database[pid]) for pid in persons_database]
这只是循环遍历person数据库中的每个键(id),并通过将该id的属性列表直接作为args传递给Person()
构造函数来创建person实例。