0

在设置对象的属性时是否有一个经验法则可以用于捕获错误?例如,假设您有一个 Shape 类,如下所示:

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

我可以执行以下操作:

>>> s = 形状(3)

>>> 大小

3

>>> 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'
4

1 回答 1

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'

(当然,您现在拥有不受保护的属性,但在 Python 中_size不可能真正保护属性。)

于 2013-05-03T19:47:44.143 回答