Python - создание объектов из словаря с циклом for - PullRequest
0 голосов
/ 01 июня 2018

Предисловие: я потратил много ЧАСОВ, пытаясь прочитать подобные посты, подобные этой, и пробовать много разных вещей, но ради жизни я не могу понять, что я делаю неправильно, или почему это не такт работа.Может кто-нибудь дать мне ответ ELI5 относительно того, что я делаю неправильно, или почему это не работает так, как я ожидаю?

class User:

    def __init__(self, first, last, age):
        self.firstname = first
        self.lastname  = last
        self.age       = age


dict = {
    'User1': {'id': 'id001', 'firstname': 'User', 'lastname': 'One', 'age': 11},
    'User2': {'id': 'id002', 'firstname': 'User', 'lastname': 'Two', 'age': 22},
    'User3': {'id': 'id003', 'firstname': 'User', 'lastname': 'Three', 'age': 33}
}


for user in dict:
    u    = dict[user]
    user = User(u['firstname'], u['lastname'], u['age'])


try:
    print(User1.lastname)
except Exception as e:
    print(e)
finally:
    print(user.lastname)

Что возвращает:

name 'User1' is not defined
Three

Очевидно, user создается три раза с данными из dict, причем данные User3 являются последними.

Если я сделаю:

for user in dict:
    print(user)

, он напечатает:

User1
User2
User3

Так что я ожидаю, что цикл for запустится, и тогда ябыть в состоянии позвонить User1.firstname, User2.lastname или User3.age, и это даст мне те же данные, что и в dict (пользователь, два, 33 соответственно), но это явно не так.

Помощь?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Для полноты - возможно создание глобальных переменных в python благодаря globals()[key] = value - но каждый, имеющий небольшой опыт, никогда бы не посоветовал вам сделать это - если бы не очень конкретные и хорошо продуманные причины, естьнет оправдания для этого.Тем не менее, здесь вы можете увидеть, как это достигается на вашем примере:

https://repl.it/repls/InternationalShamelessBug

0 голосов
/ 01 июня 2018

Вы не храните созданных вами экземпляров.

for user in dict:
    u    = dict[user]
    user = User(u['firstname'], u['lastname'], u['age'])

^^ Создайте группу из User, но присвойте каждому из них одно и то же имя, user.Это означает, что пользователи 1 и 2 будут потеряны при продолжении итерации цикла.

Если вы хотите иметь доступ к каждому из этих пользователей, вам нужно сохранить ссылку на созданный экземпляр:

users = []
for user in dict:
    u    = dict[user]
    user = User(u['firstname'], u['lastname'], u['age'])
    users.append(user)

Затем, чтобы напечатать результаты:

for user in users:
    print(user)

* PS : когда вы пишете for user in dict, вы перебираете клавиши из dict, поэтому вы получаете User1, User2, User3.

** PPS : вам абсолютно не следует использовать dict в качестве имени, которое скрывает встроенную функцию dict(), ивызовет у вас проблемы позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...