设置属性时尝试捕获错误

时间:2013-05-03 19:42:35

标签: python

在设置对象的属性时是否有遵循错误捕捉的经验法则?比方说,你有一个Shape类,如下所示:

class Shape():
    def __init__(self, size):
        self.size = size

我可以做以下事情:

  

>>> s =形状(3)

     

>>> s.size

     

3

     

>>> s.size =“你好”

     

>>> s.size

     

'你好'

但是如果属性必须是数字呢?在这种情况下如何捕获TypeErrors?我是否在 init 定义中添加了try / except?这是我的猜测:

class Shape():
def __init__(self, size):
    try:
        float(size)
        self.size = size
    except:
        raise TypeError, "Value must be numeric"

这将在初始化时捕获错误,但在设置属性时不会。当用户尝试s.size =“hello”时,如何捕获TypeError?

谢谢!

我尝试执行下面的答案但它不起作用:

class Shape():
def __init(self, size):
    self.size = size

@property
def size(self):
    return self._size

@size.setter
def size(self, value):
    self._size = float(value)

我收到以下错误消息:

  

Traceback(最近一次调用最后一次):文件“python_playground.py”,第18行,

print s.size   File "python_playground.py", line 9, in size

return self._size AttributeError: Shape instance has no attribute '_size'

1 个答案:

答案 0 :(得分:3)

要验证实例属性,请使用属性。

class Shape():

    @property
    def size(self):
        return self._size

    @size.setter
    def size(self, value):
        self._size = float(value)

现在,您的__init__()方法无需明确检查值(因为属性将从__init__()以及其他任何位置执行此操作)您还可以在其他地方获取值检查,其中一些代码会尝试设置该属性。

正如我在您的问题评论中所指出的,这里没有必要使用try/except;你只是抓住一个例外来筹集另一个。 float("hello")已经为您提供了完全合理的ValueError: could not convert string to float: 'hello'

(当然,你现在让_size属性不受保护,但真正保护Python中的属性是不可能的。)