2013-03-17 64 views
16

我想在Python中定義一個只讀屬性的類;我跟着Python文檔,並用下面的代碼上來:python - 爲什麼只讀屬性是可寫的?

#!/usr/bin/python 

class Test: 
     def __init__(self, init_str): 
       self._prop = init_str 

     @property 
     def prop(self): 
       return self._prop 

t = Test("Init") 
print t.prop 
t.prop = "Re-Init" 
print t.prop 

現在,當我嘗試執行代碼,雖然我期待錯誤/例外,我看到它得到正常執行:

$ ./python_prop_test 
Init 
Re-Init 

我的Python版本是2.7.2。我所看到的是預期的嗎?如何確保財產不可設置?

回答

24

對於這個工作,你期望的那樣,Test需要是新式類:

class Test(object): 
      ^^^^^^^^ 

這是在documentation for property()暗示:

返回屬性屬性爲新式的類(即從object派生的類)。

當我打開Test到一個新的風格類,並試圖改變prop,我得到一個異常:

In [28]: t.prop='Re-Init' 

AttributeError: can't set attribute 
+1

舊式類不給'property'數據描述符給予優先考慮;它可以讓你在實例字典中隱藏屬性。 – eryksun 2013-03-17 08:08:30

4

要使用屬性,你必須使用新的樣式類。要在Python 2中使用新式類,您必須從object繼承。將你的班級改爲class Test(object)

+0

在我的情況下,即使Python 3沒有'object' – 2017-04-16 02:02:50

相關問題