#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. Большое спасибо за разъяснение, Коллин! Это было действительно полезно.