Python 设置属性时尝试捕获错误

Python 设置属性时尝试捕获错误,python,Python,设置对象属性时是否有错误捕获的经验法则?例如,假设您有一个Shape类,如下所示: class Shape(): def __init__(self, size): self.size = size 我可以做到以下几点: >>>s=形状(3) >>>美国尺码 三, >>>s.size=“你好” >>>美国尺码 “你好” 但是,如果属性必须是数字,该怎么办?在这种情况下,如何捕捉打字错误?我是否在init定义中添加了try/except?这是我的猜测: class Sha

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

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”是的,您必须先设置它。。。我本以为这是显而易见的?