Работа с файлом 2

Что нужно сделать

Реализуйте модернизированную версию контекст-менеджера File:

  • теперь при попытке открыть несуществующий файл менеджер автоматически создаёт и открывает этот файл в режиме записи;
  • на выходе из менеджера подавляются все исключения, связанные с файлами.

Что оценивается

  • Результат вычислений корректен.
  • Модели реализованы в стиле ООП, основной функционал описан в методах классов и в отдельных функциях.
  • При написании классов соблюдаются основные принципы ООП: инкапсуляция, наследование и полиморфизм.
    • Для получения и установки значений у приватных атрибутов используются сеттеры и геттеры с соответствующими декораторами.
    • Для создания нового класса на основе уже существующего используется наследование.
    • Для статических и классовых методов используется декоратор classmethod.
  • Сообщения о процессе получения результата осмысленны и понятны для пользователя.
  • Переменные, функции и собственные методы классов имеют значащие имена, не abcd.
  • Классы и методы/функции имеют прописанную документацию.
  • Есть аннотация типов для методов/функций и их аргументов (кроме args и kwargs). Если функция/метод ничего не возвращают, то используется None.
class File:
    '''Класс контекст-менеджера File'''

    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        self.file = None

    def __enter__(self):
        try:
            self.file = open(self.filename, self.mode, encoding='UTF-8')
        except FileNotFoundError:
            print(f'Создан файл {self.filename}')
            self.file = open(self.filename, 'w', encoding='UTF-8')
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()
        if exc_type is FileNotFoundError or FileExistsError:
            return True

with File('doc.txt', 'r') as file:
    newfile = file.read()