Python 设置属性时尝试捕获错误
设置对象属性时是否有错误捕获的经验法则?例如,假设您有一个Shape类,如下所示:Python 设置属性时尝试捕获错误,python,Python,设置对象属性时是否有错误捕获的经验法则?例如,假设您有一个Shape类,如下所示: class Shape(): def __init__(self, size): self.size = size 我可以做到以下几点: >>>s=形状(3) >>>美国尺码 三, >>>s.size=“你好” >>>美国尺码 “你好” 但是,如果属性必须是数字,该怎么办?在这种情况下,如何捕捉打字错误?我是否在init定义中添加了try/except?这是我的猜测: class Sha
class Shape():
def __init__(self, size):
self.size = size
我可以做到以下几点:
>>>s=形状(3)
>>>美国尺码
三,
>>>s.size=“你好”
>>>美国尺码
“你好”
但是,如果属性必须是数字,该怎么办?在这种情况下,如何捕捉打字错误?我是否在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”时,如何捕获类型错误
谢谢大家!
我尝试实现下面的答案,但没有成功:
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)
我收到以下错误消息:
回溯(最近一次调用last):文件“python_playerd.py”,第18行,在
print s.size File "python_playground.py", line 9, in size
return self._size AttributeError: Shape instance has no attribute '_size'
要验证实例属性,请使用属性
class Shape():
@property
def size(self):
return self._size
@size.setter
def size(self, value):
self._size = float(value)
现在,您的\uuuu init\uuuu()
方法不需要显式地检查值(因为属性将从\uuuuu init\uuuu()
以及从其他任何地方进行检查),并且您还可以在其他任何地方进行值检查一些代码尝试设置该属性
正如我在对你的问题的评论中所指出的,这里没有必要使用try/except
;您只需要捕获一个异常来引发另一个异常float(“hello”)
已经为您提供了一个非常合理的value错误:无法将字符串转换为float:“hello”
(当然,您现在有了未受保护的
\u size
属性,但在Python中不可能真正保护属性。)要验证实例属性,请使用属性
class Shape():
@property
def size(self):
return self._size
@size.setter
def size(self, value):
self._size = float(value)
现在,您的\uuuu init\uuuu()
方法不需要显式地检查值(因为属性将从\uuuuu init\uuuu()
以及从其他任何地方进行检查),并且您还可以在其他任何地方进行值检查一些代码尝试设置该属性
正如我在对你的问题的评论中所指出的,这里没有必要使用try/except
;您只需要捕获一个异常来引发另一个异常float(“hello”)
已经为您提供了一个非常合理的value错误:无法将字符串转换为float:“hello”
(当然,您现在有了未受保护的
\u size
属性,但在Python中不可能真正保护属性。)您不需要在这里使用try/except
,因为float(shape)
如果给定的值无法转换为浮点值,则已引发完全cromulent异常。您的初始化(self,size)
看起来指定不正确。您不需要在此处使用try/except
,因为浮点(shape)
如果给定的值无法转换为浮点值,则已引发一个完美的cromulent异常。您的初始化(self,size)
的指定不正确。对于混淆,我很抱歉,但我的意思是class Shape():def u init _;(self,size):具有“size”而不是“Shape”属性。我实现了你的想法,但它不起作用。它“不起作用”?你能再具体一点吗?我给出的代码不包含语法错误,工作原理如所述。(我还将其编辑为使用size
而不是shape
作为属性。)我使用了该代码,然后执行s=shape(),然后执行s.size并得到此错误:shape实例没有属性“\u size”是的,您必须先设置它。。。我本以为这是显而易见的?我很抱歉造成混淆,但我的意思是说class Shape():def uu init_uu(self,size):具有“size”而不是“Shape”属性。我实现了你的想法,但它不起作用。它“不起作用”?你能再具体一点吗?我给出的代码不包含语法错误,工作原理如所述。(我还将其编辑为使用size
而不是shape
作为属性。)我使用了该代码,然后执行s=shape(),然后执行s.size并得到此错误:shape实例没有属性“\u size”是的,您必须先设置它。。。我本以为这是显而易见的?