2015-08-06 5 views
2

Я новичок в python, и я пытаюсь динамически создавать новые экземпляры в классе. Итак, позвольте мне дать вам пример, если у меня есть класс вроде этого:Динамически создавать экземпляры класса python

class Person(object): 
    def __init__(self, name, age, job): 
     self.name = name 
     self.age = age 
     self.job = job 

Насколько я знаю, для каждого нового экземпляра я должен вставить, я бы объявить переменную и прикрепить ее к человек, что-то вроде этого:

Есть ли способ, которым я могу динамически это делать? Давайте предположим, что у меня есть словарь, как это:

persons_database = { 
'id' : ['name', age, 'job'], ..... 
} 

Могу ли я создать фрагмент кода, который может выполнять итерацию по этой БД и автоматически создавать новые экземпляры в Person классе?

ответ

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

Если вам нужно получить объект 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()

------ Немного более продвинутый материал ниже ----------------

Некоторые люди упоминали использование перечня/словарных знаний для достижения того, чего вы хотите. Постижения будут немного более эффективными и вещим, но немного более трудно понять, если вы новичок в программирование/питон

в качестве словаря понимания второй части коды будет people = {id: Person(*data) for id, data in persons_database.items()}

И просто так ничего здесь идет необъяснимый ... The * перед списком в Python распаковывает список в виде отдельных элементов в последовательном порядке в списке, так что для списка l длиной п, *l будет вычисляться l[0], l[1], ... , l[n-2], l[n-1]

+1

Это сработало! Но теперь эти экземпляры не будут привязаны к какой-либо переменной? Позволяет сказать, что я создаю новую функцию в этом классе: def age_increment (self): self.возраст = + 1 нотация, что я узнал, если вы объявили экземпляр так: боб = человек (имя = «боб», возраст = 23, работа = «профессор») Чтобы использовать вы должны были бы: bob.age_increment() Как это сделать сейчас? – Juliano

+0

Просто используйте методы доступа к списку, например. для создания возраста первого человека в списке, 'people [0] .increment_age()' – lemonhead

+0

Вам нужно будет получить доступ к объектам из списка. Проблема здесь заключается в определении того, какой элемент в списке соответствует тому, кого вы хотите обновить. Для этого вы можете использовать словарь вместо списка. Я обновил свой ответ, чтобы показать, как это сделать. – rfj001

0

Конечно, простой list comprehension должен сделать трюк:

people = [Person(*persons_database[pid]) for pid in persons_database] 

Это просто перебирает каждый ключ (ID) в базе данных лиц и создает экземпляр человека, проходя через список атрибутов для данного идентификатора непосредственно в качестве аргументов в Person() конструктора.

Смежные вопросы