Мини проект "склад оргтехники"
подскажите пожалуйста. Есть класс склад, в нём словарь для получения данных от других классов, далее класс оргтехника у которого 3 потомка, принтер сканер и ксерокс. Задача такая, необходимо добавлять атрибуты присущие последним классам в словарь класса склад. Т.е. словарь должен постоянно обновляться и расширяться, а затем записываться в файл в json формате. Моя проблема в том, что я могу создать несколько экземпляров класса и добавить всё это в файл, но как сделать экземпляр класса динамичным, чтоб можно было постоянно расширять словарь не создавая каждый раз новый экземпляр класса? Я предполагаю что это делается при помощи while True, но не получается реализовать этот процесс из-за неопытности. Я новичок, изучаю Python всего 2 месяца.
Вот мой код, разумеется работает неправильно, в нём я пытаюсь каждый раз объявлять новый экземпляр класса.
class OfficeEquipmenWarehouse:
FILENAME = 'OfficeEquipmenWarehouse.json'
def __init__(self):
self.res = {'старая оргтехника': [],
'новая оргтехника': [],
'нужен ремонт': []}
self.res2 = []
class Officeequipment:
def __init__(self, is_old, new, repair, type): # состояние, тип оргтехники
self.is_old = is_old
self.new = new
self.repair = repair
self.type = type
class Printer(Officeequipment):
def __init__(self, is_old, new, repair, type, name, count):
super().__init__(is_old, new, repair, type)
self.name = name
self.count = count
def description_printer(self):
if self.is_old or self.new or self.repair:
return f'принтер {self.name}, количество {self.count}'
class Scanner(Officeequipment):
def __init__(self, is_old, new, repair, type, name, count): # название, габариты, состояние
super().__init__(is_old, new, repair, type)
self.name = name
self.count = count
def description_scanner(self):
if self.is_old or self.new or self.repair:
return f'сканер {self.name}, количество {self.count}'
class Copier(Officeequipment):
def __init__(self, is_old, new, repair, type, name, count):
# состояние, тип, название, габариты, количество
super().__init__(is_old, new, repair, type)
self.name = name
self.count = count
def description_copier(self):
return f'ксерокс {self.name}, количество {self.count}'
# Оргтехника и тип оргтехники
warhouse = OfficeEquipmenWarehouse()
names = []
while True:
exp = input()
if len(names) < 3:
names.append(exp)
names[0] = Copier(True, False, False, 'ксерокс', names[0], 5)
warhouse.res['старая оргтехника'].append(names[0].description_copier())
jsonStr = json.dumps(warhouse.res)
with open(warhouse.FILENAME, 'w+', encoding='utf-8') as file_3:
file_3.write(jsonStr)
with open('OfficeEquipmenWarehouse.json', 'r', encoding='utf-8') as f:
a = f.read()
b = json.loads(a)
for i, v in b.items():
print(f'{i}: {v}')
if exp == 'q':
quit()```
Ответы (1 шт):
Получилось, по моей задумке с помощью цикла while True я каждый раз объявляю новый объект экземпляра класса, в данном случае класса Copier, но не с помощью input, а сложением строк(каждый цикл = новое имя). Далее собираю словарь с условием что отрабатывает переменная, атрибут is_old, после собирается словарь и далее записывается в json файл, грубо говоря с проверкой на пустоту. Если пустой, то обрабатывается ошибка, если есть указанные ключи, то идёт наполнение файла. Это сырой код, и над проектом надо ещё поработать основательно, но в целом задумка удалась.
class OfficeEquipmenWarehouse:
FILENAME = 'OfficeEquipmenWarehouse.json'
res = dict()
while True:
name_exm = '1'
name_exm += name_exm
cop = input('(ксерокс)введите тип: ')
cop2 = input('(ксерокс)введите название: ')
cop3 = input('(ксерокс)введите количество ')
name_exm = Copier(True, False, False, cop, cop2, int(cop3))
if name_exm.is_old:
res.setdefault('старая оргтехника', {}).setdefault(name_exm.name, name_exm.description_copier())
with open(FILENAME, 'r+', encoding='utf-8') as file:
try:
data = json.load(file)
data['старая оргтехника'][name_exm.name] = name_exm.description_copier()
print(data)
with open(FILENAME, 'r+', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
except json.JSONDecodeError:
json.dump(res, file, ensure_ascii=False, indent=4)