2013-05-03 64 views
0

在設置對象的屬性時是否遵循經驗法則來捕捉錯誤?比方說,例如,你有一個Shape類,如下所示:嘗試設置屬性時發生錯誤

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

我可以做到以下幾點:

>>> s = Shape(3)

>>> s.size

3

>>> s.size = "hello"

>>> s.size

'hello'

但是,如果屬性必須是數字呢?在這種情況下如何捕獲TypeErrors?我是否試過/除了init定義?這是我的猜測:

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 (most recent call last): File "python_playground.py", line 18, in

print s.size File "python_playground.py", line 9, in size 

return self._size AttributeError: Shape instance has no attribute '_size' 
+3

你並不需要使用'嘗試/ except'這裏,因爲'浮動(形狀)'如果給定的值不能被轉換爲浮點型,就已經引發了一個非常強烈的異常。 – kindall 2013-05-03 19:45:43

+0

您的'__init __(self,size)'看起來不正確。 – pcurry 2013-05-03 20:22:15

回答

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)。

+0

我很抱歉的混亂,但我打算說類Shape(): def __init __(self,size): 具有「大小」而不是「形狀」的屬性。我執行了你的想法,但它不起作用。 – JasonArg123 2013-05-03 20:13:41

+0

它「不工作」?你能*稍微*更具體?我提供的代碼不包含語法錯誤,並按照描述工作。 (我也編輯它使用'size'而不是'shape'作爲屬性。) – kindall 2013-05-03 20:38:16

+0

我使用該代碼並執行s = Shape()然後執行s.size並獲取此錯誤:Shape實例沒有屬性'_size' – JasonArg123 2013-05-04 02:38:30

相關問題