Дескрипторы 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
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Дескриптор и dict в Python: кто имеет приоритет при чтении
- Дескрипторы Python: почему значение разделяется между экземплярами
- Дескрипторы Python: валидация и сброс кэша зависимых свойств
- Дескриптор Python: однократная запись и setname
- Дескриптор Python: проверка связанных полей low и high
- Дескриптор Python без get: журнал присваиваний в set
