2009-10-06 11 views
6

私は 'property'を使って、オブジェクトインスタンス変数への変更が必要なメソッドで確実にラップされるようにします。定数インスタンス変数?

インスタンスに論理的に変更しない変数がある場合はどうですか?たとえば、Processクラスを作成している場合、各Processインスタンスには頻繁にアクセスされるが、変更する必要のないpid属性が必要です。

インスタンス変数を変更しようとする誰かを処理する最もPythonの方法はありますか?

  • だけで、彼らはいけない 何かを試してみて、変更していないユーザーを信頼?

  • インスタンス変数が の場合、プロパティを使用しますが、 例外を発生させますか?

  • 他に何か?

+0

http://stackoverflow.com/questions/1358711/raising-an-exception-on-updating-a-constant-attribute-in-python –

答えて

6

プリペンド名の行では、読み取り専用プロパティを作成、Pythonは例外の世話をする、と変数自体が誤って上書きから保護されます。

class foo(object): 
    def __init__(self, bar): 
     self.__bar = bar 

    @property 
    def bar(self): 
     return self.__bar 

f = foo('bar') 
f.bar   # => bar 
f.bar = 'baz' # AttributeError; would have to use f._foo__bar 
+0

最後の2行では、 "f.foo"と "f .foo = 'baz' "、そうですか? –

+0

ええ、私は変数名を混ぜました。既に修正済みです。 –

+1

私は、名前のついた "プライベート"属性が、彼らが価値あるものよりもトラブルになることがわかりました。単一のアンダースコアは、サブクラス化を容易にしながら、ユーザーに「これに触れないでください」と伝えます。 –

1

おそらく__setattr__を上書きできますか? __を持つ変数の

def __setattr__(self, name, value): 
    if self.__dict__.has_key(name): 
     raise TypeError, 'value is read only' 
    self.__dict__[name] = value 
3

単にユーザーを信頼することは必ずしも悪いことではありません。一度使用して捨てるための素早いPythonプログラムを書いているだけなら、pidフィールドを変更しないでください。

IMHO読み取り専用フィールドを強制するもっともPythonの方法は、フィールドの設定時に例外を発生させるプロパティを使用することです。

だから、IMHOあなたはこのものについて良い本能を持っています。

1

単純にプロパティと隠し属性(接頭辞,アンダースコア)を使用します。

単純なプロパティは読み取り専用です。二重のアンダースコアで非表示

>>> class Test (object): 
... @property 
... def bar(self): 
... return self._bar 
... 
>>> t = Test() 
>>> t._bar = 2 
>>> t.bar 
2 
>>> t.bar = 2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: can't set attribute 

実装を隠すために、しかし、あなたは、サブクラスの属性と衝突しないことを確認するために使用されていません。例えばミックスインを考えてみると、それは非常に注意深くなければなりません!

属性を非表示にする場合は、単一のアンダースコアを使用します。また、追加する余分な魔法はありません。set関数を定義しないと、プロパティはメソッドの戻り値と同じように読み取り専用になります。

関連する問題