Поднимите "не редактируемое" исключение - PullRequest
0 голосов
/ 01 мая 2018

У меня есть класс Book, который имеет свойство editable вместе с другими:

class Book():

    def __init__(self, name, ..., editable=True):
        self.name = name
        ...
        self.editable = editable

Book имеет методы get_details(), set_details() и delete().

Если для editable установлено значение False, я хочу вызвать исключение в set_details() и delete(), заявив, что Книга не редактируется.

Я просмотрел документы по Python, но мне не удалось найти ничего похожего на нередактируемое исключение.

Является ли создание пользовательского исключения лучшим способом сделать это, или кто-нибудь может предложить другой обходной путь?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Я бы рекомендовал использовать декоратор свойств для ограничения изменяемых атрибутов. Например, рассмотрим:

class Book(object):
  """My book object is a wrapper for details"""

  class Details(object):
    """My details object"""

  def __init__(self):
    self._details = Details()

  @properties
  def details(self):
     return self._details

пытается запустить

book = Book()
book.details = new_details

вызовет AttributeError . Чтобы включить и выключить этот параметр с помощью редактируемого флага, вы можете добавить следующий оформленный метод:

  @details.setter
  def details(self, new_details):
    if self._editable:
      self._details = new_details
    else:
      raise AttributeError("Attribute cannot be set when Book is not editable.")

Что касается удаления, сборщик мусора в Python должен очищать старые переменные, если вы умны с помощью scope:)

Чтобы узнать больше о свойствах и установщиках, проверьте это . Если вы планируете сделать «книгу» неизменной после определенного момента, я бы порекомендовал изучить шаблон фабричного дизайна (где вы могли бы программно создать класс книги перед его раскрытием), а не включать и выключать флаг.

0 голосов
/ 01 мая 2018

Насколько я знаю, Python не имеет такого типа исключений. Вы можете определить свой собственный класс исключения.

class NotEditableException(Exception):
    def __init__(self,message="Not editable"):
        super(NotEditableException,self).__init__(message)

Теперь вы можете поднять исключение следующим образом.

if not self.editable:
    raise NotEditableException("This is your error message");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...