Как правильно задать список возможных значений для атрибута объекта? Как правильно задать список возможных значений для атрибута объекта?
Например:
1) есть класс Task,
2) есть экземпляр класса task,
3) у него есть атрибут task.priority,
4) который должен принимать значения options = ['low', 'medium', 'high'].
В результате я должен иметь возможность:
1) задать task.priority = 'low'
2) получить ошибку, если я попробую задать task.priority = 'something else'
Как вариант можно проверять в конструкторе класса if value in options , или есть более правильный способ это сделать?

21 Авг 2019 в 07:08
137 +1
0
Ответы
1

Для задания списка возможных значений для атрибута объекта можно воспользоваться дескрипторами в Python. Дескрипторы позволяют контролировать доступ к атрибутам объекта и реализовать логику проверки значений.

В данном случае можно создать свой класс дескриптора, который будет проверять, что значение, которое мы пытаемся присвоить атрибуту "priority", содержится в списке "options". Если значение не содержится в списке, то выбрасывается исключение.

Пример реализации:

class PriorityDescriptor:
def __init__(self, options):
self.options = set(options)
def __get__(self, instance, owner):
return instance._priority
def __set__(self, instance, value):
if value not in self.options:
raise ValueError(f"Invalid value for priority. Allowed values are {', '.join(self.options)}")
instance._priority = value
class Task:
priority = PriorityDescriptor(['low', 'medium', 'high'])
def __init__(self, priority):
self.priority = priority
# Пример использования
task = Task('low')
print(task.priority) # low
# Попытка установить некорректное значение
try:
task.priority = 'something else'
except ValueError as e:
print(e) # Invalid value for priority. Allowed values are low, medium, high

Таким образом, мы создали дескриптор PriorityDescriptor, который проверяет значения на соответствие списку options при попытке установить атрибут priority объекту класса Task. В случае передачи некорректного значения будет выброшено исключение.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 251 автору
Первые отклики появятся уже в течение 10 минут
Прямой эфир