Дескрипторы Python: значения по умолчанию и удаление переопределений

Напишите решение на Python и проверьте его на странице.

Другие упражнения по этой теме: Дескрипторы Python: задачи на get, set и set_name.

Сброс переопределений конфигурации

Конфигурационный профиль виртуальной машины хранит числовые лимиты ресурсов, такие как память или ядра. Для каждого параметра задано заводское значение по умолчанию: пока в профиль конкретной машины ничего не записали, чтение поля просто возвращает этот стандартный лимит и не оставляет никаких записей в словаре экземпляра.

Пользователь может явно переопределить параметр допустимым целым числом — тогда новое значение сохраняется в словаре объекта. Чтобы сбросить настройку обратно к заводской, используют оператор del. При этом удаление ориентируется строго на факт наличия индивидуальной записи: если ключ уже был в словаре объекта (даже когда туда записали число, в точности равное заводскому), del удаляет эту запись и возвращает атрибут к состоянию по умолчанию. Если же явной записи в экземпляре не было, попытка удалить атрибут возбуждает AttributeError.

Реализуйте data-дескриптор с поддержкой метода __delete__, который отслеживает наличие индивидуального переопределения в словаре объекта и корректно возвращает поле к заводскому значению.

Что уже дано

В редакторе представлена заготовка класса DefaultOverride с методами __init__, __set_name__, __get__, __set__ и __delete__. Вспомогательная функция observe_default_sequence доступна во время проверки и не требует собственной реализации.

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

Реализуйте класс дескриптора данных DefaultOverride(default).

Конструктор принимает заводское значение по умолчанию default — целое число от 0 до 1 000 000.

Поведение дескриптора:

  • Метод __set_name__(self, owner, name) автоматически вызывается при создании класса-владельца. Имена полей — идентификаторы ASCII длиной от 1 до 30 символов. Дескриптор сохраняет имя приватного ключа вида f"_{name}" для изоляции значений в instance.__dict__.
  • До первого явного присваивания чтение атрибута возвращает заводское значение default, не создавая записей в instance.__dict__.
  • Обращение к атрибуту через класс (instance is None в __get__) должно возвращать сам объект дескриптора.
  • Присваивание значения через __set__(self, instance, value) сохраняет переданное целое число (допустимы целые числа от 0 до 1 000 000, включая подклассы int, такие как bool) в instance.__dict__ под ключом f"_{name}". Переданное значение и его исходный тип сохраняются без приведения типов. Последующие присваивания перезаписывают это значение.
  • Удаление атрибута через оператор del (__delete__(self, instance)) удаляет запись f"_{name}" из словаря instance.__dict__. Если ключ присутствовал в словаре, он удаляется (даже если записанное значение совпадало с заводским или было ложным), после чего последующие чтения снова возвращают значение default без автоматического создания ключа. Если же явной записи в словаре экземпляра не было, вызов возбуждает AttributeError и не меняет состояние объекта.
  • Разные поля (от 1 до 4 на класс) и разные экземпляры (от 1 до 4, включая обычные унаследованные классы) хранят значения независимо друг от друга и не затрагивают посторонние ключи в словарях экземпляров.

Ввод и вывод

Стандартные потоки ввода stdin и вывода stdout в решении не используются: считывать ввод и вызывать print() не нужно. После выполнения кода учащегося проверяющая система считывает из пространства имён модуля функцию или класс верхнего уровня DefaultOverride и вызывает её с проверочными аргументами.

Пример использования

class Profile:
    cores = DefaultOverride(2)
p = Profile()
print(p.cores, p.__dict__)
p.cores = 2
print(p.__dict__)
del p.cores
print(p.cores, p.__dict__)
try:
    del p.cores
except AttributeError:
    print('AttributeError')

Вывод:

2 {}
{'_cores': 2}
2 {}
AttributeError
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи