【问题标题】:Class object has no attribute 'get'类对象没有属性“get”
【发布时间】:2021-10-15 23:51:57
【问题描述】:

我正在尝试以字典的形式订购列表用户数据,其中包含由 API 生成的随机用户数据。我正在使用 .get 从列表中的字典中提取出生日期 (dob) 来组织数据,但我不断收到错误消息“AttributeError: 'randomuser' object has no attribute 'get'”。由于问题似乎来自与“randomuser”类的交互,因此我尝试通过将用户数据直接放入主程序循环中的用户字典来绕过该类,这似乎有效。但是,当我尝试学习 OOP 时,感谢任何帮助解释我在“随机用户”课程中哪里出错的地方!干杯!

import requests
import json


class randomuser(object):
    
    def __init__(self, firstname, lastname, gender, username, password, dob) -> None:
        self.firstname = firstname
        self.lastname = lastname
        self.gender = gender
        self.username = username
        self.password = password
        self.dob = dob
        self.user_dict = {
            "firstname": self.firstname,
            "lastname": self.lastname,
            "gender": self.gender,
            "username": self.username,
            "password": self.password,
            "dob": self.dob
        }

    def __repr__(self):
        return str(self.user_dict)

""" 

create a 10 user list with 5 men and 5 women 
"""

male = 0
female = 0
user_list = []
while male < 5 or female < 5:

    response = requests.get("https://randomuser.me/api/")   # pulls JSON object from API
    user = json.loads(response.text)['results'][0]   # converst to Python dictionary
    firstname = user['name']["first"]
    lastname = user['name']["last"]
    gender = user['gender']
    username = user['login']['username']
    password = user['login']['password']
    dob = user['dob']['date']
    
    new_user = randomuser(firstname, lastname, gender, username, password, dob)

    if gender == 'male' and male < 5:
        male += 1
        user_list.append(new_user)
    elif gender == 'female' and female < 5:
        female += 1
        user_list.append(new_user)

"""

sort user list by DOB
"""

user_list.sort(key=lambda x: x.get('dob'))
print(user_list)

【问题讨论】:

    标签: python json api


    【解决方案1】:

    您有一个类列表,而不是字典,因此您的 lambda 参数是一个没有 get 函数的类

    要按dob 属性排序,您可以这样做

    user_list.sort(key=lambda x: x.dob)
    

    我还建议使用dataclassesNamedTuple 而不是定义user_dict,因为您仅将其用于打印

    【讨论】:

    • 谢谢@OneCricketeer!我稍微研究了数据类,看起来它是一种更容易写出实例属性的方法。在这个特定的例子中,数据类会给我带来什么好处(对不起我的无知)?但是您的回答帮助我意识到了这个问题。我用解决了问题的 new_user.user_dict 填写了列表。
    • 使用数据类,你不需要定义 repr 函数,也不需要携带一个不会更新的额外字典,因为你可能会改变实际的类属性跨度>
    猜你喜欢
    • 2012-07-24
    • 2017-11-12
    • 1970-01-01
    • 2021-08-21
    • 2014-04-28
    • 2015-04-15
    • 2015-10-19
    • 2021-11-16
    • 2015-10-27
    相关资源
    最近更新 更多