2013-03-17 16 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です。私が見ていることは、それが期待されていますか?プロパティが設定可能でないことを確認するにはどうすればよいですか?あなたが期待するよう、これが新しいスタイルのクラスである必要がTest、機能するために

答えて

24

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

これはdocumentation for property()にほのめかしている:

戻り新しいのプロパティ属性スタイルクラスobjectから派生したクラス)。私は新しいスタイルのクラスにTestを回し、そしてpropを変更しようとすると

、私は例外を取得:

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

AttributeError: can't set attribute 
+1

古いスタイルのクラスは、 'property'データ記述子に優先順位を与えません。インスタンスdictの属性をシャドーできます。 – eryksun

4

新しいスタイルのクラスを使用する必要がありますプロパティを使用するには。 Python 2で新しいスタイルのクラスを使用するには、objectから継承する必要があります。あなたのクラスdefをclass Test(object)に変更してください。

+0

私の場合、Python 3でも 'object'なしでは動作しませんでした –