在设置对象的属性时是否有遵循错误捕捉的经验法则?比方说,你有一个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'
答案 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中的属性是不可能的。)