Python - 使用for循环从字典实例化对象

时间:2018-06-01 19:44:50

标签: python loops class

前言:我花了很多时间尝试阅读类似这样的帖子,并尝试了很多不同的东西,但对于我的生活,我无法理解我做错了什么,或者为什么这样做'工作。有人可以给我一个关于我做错了什么的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.firstnameUser2.lastnameUser3.age,它会给我dict(分别为User,Two,33)中的相同数据,但情况显然不是这样。

帮助?

2 个答案:

答案 0 :(得分:3)

您并非存储您创建的实例。

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

^^创建一堆User' s,但为每个user分配相同的名称users = [] for user in dict: u = dict[user] user = User(u['firstname'], u['lastname'], u['age']) users.append(user) 。这意味着用户1和2会在您继续循环循环时丢失。

如果您想要访问这些用户,则需要存储对创建的实例的引用:

for user in users:
    print(user)

然后,打印结果:

for user in dict

* PS :当您编写dict时,您正在迭代User1, User2, User3,这就是您获得dict的原因}。

** PPS :您绝对不应该使用dict()作为名称,它会影响内置-s功能,并会在以后引起您的问题。

答案 1 :(得分:1)

为了完整性 - 感谢globals()[key] = value可以在python中创建全局变量 - 但是每个有经验的人都不会建议你这样做 - 如果不是因为非常具体和经过深思熟虑的原因没有理由这样做。尽管如此,你可以在这里看到它是如何实现的:

https://repl.it/repls/InternationalShamelessBug