【问题标题】:Try Catch errors when setting attributes [duplicate]设置属性时尝试捕获错误[重复]
【发布时间】:2013-05-03 19:42:35
【问题描述】:

在设置对象的属性时,是否有一个经验法则可用于捕获错误?例如,假设您有一个 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'

【问题讨论】:

  • 你不需要在这里使用try/except,因为float(shape)如果给定的值不能转换为浮点数,已经引发了一个完美的异常。
  • 您的__init__(self, size) 看起来指定错误。

标签: python


【解决方案1】:

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

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 中无法真正保护属性。)

【讨论】:

  • 我很抱歉造成混乱,但我想说的是 class Shape(): def __init__(self, size): 属性为“size”而不是“shape”。我实现了你的想法,但它不起作用。
  • 它“不起作用”?你能稍微更具体一点吗?我提供的代码不包含语法错误,并且按描述工作。 (我还编辑它以使用size 而不是shape 作为属性。)
  • 我使用该代码并执行 s = Shape() 然后执行 s.size 并得到此错误:Shape instance has no attribute '_size'
  • 是的,您必须先设置它...我以为这很明显?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
相关资源
最近更新 更多