Как я могу создать экземпляр объекта в цикле и добавить каждый экземпляр в список?

#python #attributes

#python #атрибуты

Вопрос:

Привет, я получаю сообщение об ошибке здесь: AttributeError: у объекта ‘dict’ нет атрибута ‘tag’ вот мой код:

 class Move:
    def __init__(self, tag, quantity, date):
        self.tag = tag
        self.quantity = quantity
        self.date = date

moves_list = []
const_weight = 15

def last_tag():
    JSON_file = open('movements.json')
    myList = json.load(JSON_file)
    JSON_file.close()
    print(myList[-1].tag)
    return myList[-1].tag

def last_date():
    JSON_file = open('movements.json')
    myList = json.load(JSON_file)
    JSON_file.close()
    print(myList[-1].date)
    return myList[-1].date
while True:
    tag_rilevato = last_tag()
    if my_tag == last_tag():
            m = Move(my_tag, const_weight, last_date())
            moves_list.append(m)
  

Я не понимаю, что-то не так с myList[-1].tag или myList[-1].quantity или myList[-1].date ? и кто-нибудь может что-нибудь предложить, большое вам спасибо

Комментарии:

1. json.load() возвращает dict объект, а не Move объект. Это помогает?

Ответ №1:

Вам нужно получить доступ к возвращению json.load() в качестве словаря, а не к вашему Move объекту. Поэтому используйте ['tag'] вместо .tag . Вот так:

 def last_tag():
    with open('movements.json', 'r') as fh:
        myList = json.load(fh)
    return myList[-1]['tag']

def last_date():
    with open('movements.json', 'r') as fh:
        myList = json.load(fh)
    return myList[-1]['date']

# Rest of code is unchanged
  

Я также изменил чтение / запись файла на рекомендуемый with open() as.. синтаксис. Конечно, это не требуется для устранения вашей проблемы.

Комментарии:

1. Чем вам это очень помогло, я все еще получаю ошибки, хотя я подозреваю, что когда мой файл пуст, он выходит из строя, и я решил изменить его так with open('movements.json', 'r') as j: myList = json.loads(j.read()) , я не знаю, неправильно ли это

2. В документации предполагается, что json.load() функция принимает объект file (т. Е. fh Или j В моем / вашем коде) и json.loads() принимает строку. Итак, в вашем случае вы могли бы сделать json.load(j) или json.loads(j.read()) — они функционально идентичны.

3. Большое спасибо за разъяснение, Коллин! Это было действительно полезно.