提高“不可编辑”的例外

时间:2018-05-01 07:15:51

标签: python exception

我有一个类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 :(得分:1)

据我所知,python没有这种类型的异常。您可以定义自己的自定义Exception类。

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");

答案 1 :(得分:1)

我建议使用属性装饰器来限制可变属性。 例如,考虑:

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的垃圾收集器应该清理旧变量,只要你对范围很聪明:)

有关属性和设置器的更多信息,请check out this。如果您打算在某一点之后使“书”不可变,我建议您查看一个factory design pattern(您将以编程方式构建书类,然后再展开它),而不是打开和关闭标志。