Мини проект "склад оргтехники"

подскажите пожалуйста. Есть класс склад, в нём словарь для получения данных от других классов, далее класс оргтехника у которого 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 шт):

Автор решения: StanleyIG

Получилось, по моей задумке с помощью цикла 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)
→ Ссылка